Java 8 Stream API 활용
스트림 생성
스트림은 배열, 컬렉션, 기본 타입, 스트림(파일 스트림, 병렬 스트림) 등을 통해 생성할 수 있다.
또한 Stream API가 제공하는 builder(), generate(), iterate() 등의 메소드를 이용하면 Stream을 생성할 수 있다.
Empty Stream
빈 스트림 생성도 가능하다.
Stream.empty();
Collection
list, map, set 등의 타입을 이용해 생성할 수도 있다.
String[] language = {"java", "kotlin", "python", "c", "go"};
List<String> languageList = Arrays.asList(language);
Stream<String> listStream = languageList.stream();
Array
// 방식 1
String[] stringArray = {"a", "b", "c", "d"};
Stream<String> arrStream1 = Stream.of(stringArray);
// 방식 2
Stream<String> arrStream2 = Arrays.stream(new String[]{"a", "b", "c", "d"});
기본 타입 (int, long, double)
기본 타입인 int, long, double 형을 저장할 수 있는 배열에 관한 스트림
제네릭을 사용하지 않기 때문에 불필요한 오토박싱이 일어나지 않는다.
e.g. Stream::mapToLong 을 통해 LongStream을 반환
// IntStream
IntStream intStream = IntStream.range(5, 10);
intStream.forEach(System.out::print);
------------
결과
56789
------------
//LongStream
LongStream longStream = LongStream.rangeClosed(10000000000L, 10000000003L);
longStream.forEach(System.out::println);
------------
결과
10000000000
10000000001
10000000002
10000000003
------------
//DoubleStream
DoubleStream doubleStream = new Random().doubles(3);
doubleStream.forEach(System.out::println);
------------
결과
0.4272902520444488
0.3267782859918429
0.0519048593347321
------------
Stream Method 활용
generate나 iterate는 스트림 사이즈가 무한하기 때문에 제한점을 정해주어야 한다.
1. builder()
Stream<String> builderStream = Stream.<String>builder().add("a").add("b").add("b").build();
builderStream.forEach(System.out::println);
builderStream.forEach(item -> System.out.printf("%s ", item));
// a b b
2. generate()
Supplier<T>에 해당하는 람다를 인자로 넘길 수 있다.
입력값 없이 리턴값만 있는 함수형 인터페이스
Stream<String> generateStream = Stream.generate(() -> "generate").limit(2);
generateStream.forEach(item -> System.out.printf("%s ", item));
//generate generate
3. iterate()
Intstream iterate(int seed, IntUnaryOperator f)
초기 값(seed)과 해당 값을 다루는 람다(IntUnaryOperato)를 이용해 스트림에 들어갈 요소를 만든다.
UnaryOperator<T>
IntStream iterateStream = IntStream.iterate(30, n -> n+2).limit(3);
iterateStream.forEach(item -> System.out.printf("%s ", item));
// 30 32 34
4. concat()
두 개의 스트림을 연결해 새로운 스트림을 만든다.
내부적으로 Spliterator 인터페이스를 사용해서 처리한다.
Spliterator<T>
소스의 요소를 순회 및 파티셔닝 하기 위한 인터페이스
병렬작업에 특화되어있다.
Stream<String> stream1 = Stream.of("Stream과 Stream을 연결하여,");
Stream<String> stream2 = Stream.of("생성할 수도 있습니다.");
Stream<String> concatStream = Stream.concat(stream1, stream2);
concatStream.forEach(item -> System.out.printf("%s ", item));
// Stream과 Stream을 연결하여, 생성할 수도 있습니다.
[참고] 블로그
'Java' 카테고리의 다른 글
[스트림 활용] 중간 연산 (0) | 2021.05.18 |
---|---|
[Effective Java 7장] 람다 (0) | 2021.05.09 |