[JAVA] Stream_ (1) Stream 생성

2023. 11. 28. 20:10백엔드/JAVA

728x90

 

 

Stream

  1. Stream 생성 
  2. 중간연산(링크)
  3. 결과반환

Stream이란?

자바8에서 추가한 스트림은 람다를 활용할 수 있는 기술 중의 하나이며, 스트림은 컬렉션이나 Object 등의 데이터들을 하나씩 참조하여 반복적인 처리가 가능하도록 도와주는 기능.

 


1. Stream 생성

 

비어있는 Stream 생성

//예시코드
Stream<String> emptyStream = Stream.empty();
stream.forEach(s -> System.out.println(s));

//출력

 

Collection(List, Map, ...) Stream 생성

//예시코드
List<String> listStream = Arrays.asList("l1", "l2", "l3");
listStream.stream().forEach(System.out::println);

//출력
l1
l2
l3

 

배열 Stream 생성

//예시
String[] arrStream = new String[]{"a1", "a2", "a3"};
Arrays.stream(arrStream).forEach(System.out::println);

//출력
a1
a2
a3

 

Stream.builder()

//예시
Stream<String> builderStream =
                Stream.<String>builder()
                        .add("b1").add("b2").add("b3")
                        .build();
builderStream.forEach(System.out::println);

//출력
b1
b2
b3

 

Stream.generate()

generate 메서드를 사용시 Supplier<T>에 대응하는 람다로 값을 넣을 수 있는데, 이 때 생성되는 스트림은 크기가 정해져있지 않고 무한대로 실행되기 때문에, 제한(limit)이 필요

//예시
Stream<String> generatedStream =
	Stream.generate(() -> "generatedStream").limit(3);
generatedStream.forEach(System.out::println);

//출력
generatedStream
generatedStream
generatedStream

 

Stream.iterate()

iterate() 메서드는 초기값과 초기값에 해당하는 값을 다루는 람다를 이용하여 스트림에 대입될 요소를 생성.

아래 예제는 초기값이 "테스트"고, "~!"를 누적하는 값들이 계속해서 다음 요소의 인풋으로 들어 가게 되며, 이 메서드도 마찬가지로 무한대로 실행되기 떄문에, 제한(limit)이 필요

//예시
Stream<String> iterateStream =
	Stream.iterate("테스트", n -> n + "~!").limit(5); // [30, 32, 34, 36, 38]
iterateStream.forEach(System.out::println);

//출력
테스트
테스트~!
테스트~!~!
테스트~!~!~!
테스트~!~!~!~!

 

기본타입형 Stream

제네릭을 사용하지 않고, 직접적으로 해당 타입의 스트림을 다룰 수 있음.

//예시
IntStream intStream = IntStream.range(1, 5); // range:두번째인자인종료값을포함하지않음 [1, 2, 3, 4]
intStream.forEach(System.out::println);
//출력
1
2
3
4

//예시
LongStream longStream = LongStream.rangeClosed(1, 5); // rangeClosed:두번째인자인종료값을포함[1, 2, 3, 4, 5]
longStream.forEach(System.out::println);
//출력
1
2
3
4
5

 

제네릭을 사용하지 않기에 오토박싱(auto-boxing)이 불필요하게 일어나지 않으며, 필요하다면 boxed 메서드를 이용해서 boxing 가능

//예시
Stream<Integer> boxedIntStream = IntStream.range(1, 5).boxed();
boxedIntStream.forEach(System.out::println);

//출력
1
2
3
4

 

제네릭을 사용하지 않기 때문에 불필요한 오토박싱(auto-boxing)이 일어나지 않습니다. 필요한 경우 boxed 메소드를 이용해서 박싱(boxing)할 수 있습니다.

 

문자열 Stream

정규식을 이용한 문자열을 스트림으로 생성

//예시
Stream<String> stringStream =
    Pattern.compile(" ").splitAsStream("안녕 난 스트림");
stringStream.forEach(System.out::println);

//출력
안녕
난
스트림

 

파일 Stream

File 클래스의 lines메서드로 파일의 각 라인 스트림 생성

try {
    Stream<String> fileStream =
            Files.lines(Paths.get("fileStream.txt"),
                    Charset.forName("UTF-8"));
} catch (IOException e) {
    throw new RuntimeException(e);
}

 

Strem.of()

//예시
Stream<String> stream = Stream.of("안녕", "나는", "concatStream~");
stream.forEach(System.out::println);

//출력
안녕
나는
concatStream~

 

Stream.concat()

두 개의 스트림을 연결해서 새로운 하나의 스트림 생성

//예시
Stream<String> concatStream1 = Stream.of("안녕", "나는", "concatStream~");
Stream<String> concatStream2 = Stream.of("반가워", "나도", "concatStream!");
Stream<String> newStream = Stream.concat(concatStream1, concatStream2);
newStream.forEach(System.out::println);

//출력
안녕
나는
concatStream~
반가워
나도
concatStream!

 

참고 :

https://futurecreator.github.io/2018/08/26/java-8-streams/

https://codechacha.com/ko/stream-creation/

https://mangkyu.tistory.com/112

728x90

'백엔드 > JAVA' 카테고리의 다른 글

[JAVA] Stream_ (2) Stream 중간연산  (2) 2023.11.29
[JAVA] Stream_ map() 과 flatMap() 차이  (0) 2023.11.29
[JAVA] 맥북 자바 완적 삭제  (0) 2023.03.27
[설치] JDK 버전 변경 방법  (0) 2023.03.08
[설치] JAVA 11 설치방법  (0) 2023.03.07