본문 바로가기

Java

[스트림 활용] 생성

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