JAVA - 람다와 스트림(5)

DevSeoRex·2022년 11월 9일
2
post-thumbnail

지연된 연산

  • 최종 연산이 수행되기 전까지는 중간연산이 수행되지 않음
  • 중간 연산을 호출하는 것은 단지 어떤 작업이 수행되어야하는지를 지정하는 것임
  • 최종 연산이 수행되어야 비로소 스트림의 요소들이 중간 연산을 거쳐 최종 연산에서 소모됨

Stream<Integer>와 IntStream

요소의 타입이 T인 스트림은 기본적으로 Stream<T>이지만, 오토박싱 & 언박싱으로 인한 비효율을 줄이기 위해 데이터 소스의 요소를 기본형으로 다루는 스트림인 IntStream, LongStream, DoubleStream이 제공된다.

Stream<Integer>를 대신 IntStream을 사용하는 것이 더 효율적이고, int 타입의 값으로 작업하는데 유용한 메서드들이 포함되어 있어 유리하다.

병렬 스트림

  • 스트림으로 데이터를 다루게 되면 병렬 처리가 쉬워짐
  • 스트림에 병렬로 연산을 수행하도록 하려면, parallel( ) 메서드를 호출하면 된다
  • 병렬로 처리되지 않게 하려면 sequential( )을 호출하면 된다.
  • 모든 스트림은 기본적으로 병렬 스트림이 아니므로 sequential( )을 호출하지 않아도 된다.
  • 병렬처리가 필요할 경우에만 parallel( )을 호출하면 된다.
// 스트림의 병렬 처리 예제
int sum = strStream.parallel() // strStream을 병렬 스트림으로 전환
					.mapToInt(s -> s.length())
                    .sum();

병렬처리가 항상 더 빠른 결과를 얻게 해주는 것이 아니라는 것에 주의해야 한다.

스트림 만들기

  • 컬렉션
    • 컬렉션의 최고 조상인 Collection에 stream( )이 정의되어 있다.
    • List와 Set을 구현한 컬렉션 클래스들은 모두 스트림을 생성할 수 있다.
    • stream( )은 해당 컬렉션을 소스로 하는 스트림을 반환한다.
// Collection에 정의된 스트림 메서드
Stream<T> Collection.stream()

// List로 부터 스트림을 생성하는 예제
List<Integer> list = Arrays.asList(1,2,3,4,5);  // 가변인자
Stream<Integer> intStream = list.stream(); 		// list를 소스로 하는 컬렉션 생성
  • forEach( )
    • forEach( )는 지정된 작업을 스트림의 모든 요소에 대해 수행한다.
    • 최종 연산이므로 수행하면 스트림이 닫힌다.
    • forEach( )는 두 번 호출할 수 없다.
    • 스트림의 요소를 한번 더 출력하려면 스트림을 새로 생성해야 한다.
// forEach()를 사용하는 예제
intStream.forEach(System.out::println); // 스트림의 모든 요소를 출력한다.
intStream.forEach(System.out::println); // 에러. 스트림이 이미 닫혔다.

배열

배열을 소스로 하는 스트림을 생성하는 메서드는 Stream과 Arrays에 정의되어 있다.

// Stream과 Arrays에 정의된 메서드 List
Stream<T> Stream.of(T... values) // 가변 인자
Stream<T> Stream.of(T[])
Stream<T> Arrays.stream(T[])
Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive)
// 문자열 스트림을 생성하는 다양한 예제
Stream<String> strStream = Stream.of("a", "b", "c"); // 가변인자
Stream<String> strStream = Stream.of(new String[] {"a","b","c"});
Stream<String> strStream = Arrays.stream(new String[] {"a","b","c"});
Stream<String> strStream = Arrays.stream(new String[] {"a","b","c"}, 0, 3);

기본형 배열을 소스로 하는 스트림

// 기본형 배열을 소스로 하는 스트림 예제
IntStream IntStream.of(int... values)
IntStream IntStream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array, int startInclusive, int endExclusive)

위 예제처럼 IntStream 이외에도 LongStream과 DoubleStream을 반환하는 메서드들도 존재한다.

특정 범위의 정수

IntStream과 LongStream은 지정된 범위의 연속된 정수를 스트림으로 생성해서 반환하는
range( )와 rangeClosed( )를 가지고 있다.

// range()
IntStream IntStream.range(int begin, int end)

// rangeClosed()
IntStream IntStream.rangeClosed(int begin, int end)

range( )의 경우 end가 범위에 포함되지 않고, rangeClosed( )는 포함된다.

// range() 사용 예제
IntStream intStream = IntStream.range(1,5); 		// 1,2,3,4

// rangeClosed() 사용 예제
IntStream intStream = IntStream.rangeClosed(1,5); 	// 1,2,3,4,5

int보다 큰 범위의 스트림을 생성하려면 LongStream에 정의된 동일한 이름의 메서드를 사용하면 된다.

1개의 댓글

comment-user-thumbnail
2022년 11월 9일

람보와 스트림

답글 달기