2023. 11. 28. 20:10ㆍ백엔드/JAVA
Stream
- Stream 생성
- 중간연산(링크)
- 결과반환
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/
'백엔드 > 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 |