[java] 스트림 API의 최신 업데이트 및 새로운 기능

Java 8에서 도입된 스트림 API는 데이터 처리 작업을 간단하고 효율적으로 처리할 수 있도록 도와주는 기능입니다. 이후 여러 버전의 Java에서 스트림 API는 지속적으로 업데이트되어 새로운 기능과 개선된 성능을 제공하고 있습니다. 이번 글에서는 최신 업데이트와 새로운 기능들을 살펴보도록 하겠습니다.

1. takeWhiledropWhile 메소드

Java 9에서 도입된 takeWhiledropWhile 메소드는 스트림에서 특정 조건을 만족하는 요소들을 선택하거나 제외할 수 있도록 도와줍니다. takeWhile 메소드는 조건을 만족하지 않는 요소를 만날 때까지 요소를 선택하며, dropWhile 메소드는 조건을 만족하는 요소까지 건너뛴 후 남은 요소들을 반환합니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

List<Integer> filteredNumbers = numbers.stream()
                                       .takeWhile(n -> n < 4)
                                       .collect(Collectors.toList());

System.out.println(filteredNumbers); // [1, 2, 3]

2. 병렬 스트림의 forEachOrdered

Java 9에서는 forEachOrdered 메소드가 병렬 스트림에서도 순서를 보장하도록 변경되었습니다. 이전에는 병렬 스트림에서 forEach 메소드를 사용하면 요소들의 처리 순서가 보장되지 않았지만, forEachOrdered 메소드를 사용하면 요소들의 순서를 보장할 수 있습니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

numbers.parallelStream()
       .forEachOrdered(System.out::println); // 1 2 3 4 5 6 (순서 보장)

3. Optional을 반환하는 Stream 메소드

Java 11에서는 Stream 인터페이스에 몇 가지 새로운 메소드가 추가되었는데, 이 중 몇 가지는 Optional을 반환합니다. Stream 객체에서 값을 찾을 때마다 Optional로 감싸서 반환하므로, 값이 없을 수도 있는 경우에 대한 처리가 간편해졌습니다.

List<String> names = Arrays.asList("John", "Jane", "David");

Optional<String> firstName = names.stream()
                                  .findFirst();

System.out.println(firstName.orElse("Unknown")); // John (값이 있으면 반환, 없으면 기본값 반환)

4. 미디어 처리를 위한 개선된 Stream API

Java 14에서는 미디어 처리 작업을 위한 개선된 Stream API가 도입되었습니다. 이러한 API는 오디오나 비디오 데이터와 같은 미디어를 처리하는데 유용합니다. 예를 들어, 다음과 같이 오디오 스트림을 처리할 수 있습니다.

AudioInputStream audioStream = ...; // 오디오 스트림 객체

Stream<Frame> audioFrames = audioStream.frames();
audioFrames.filter(frame -> frame.getVolume() > 0.5)
           .forEach(System.out::println);

결론

Java 스트림 API는 지속적으로 업데이트되고 개선되고 있어 매우 강력하고 유용한 기능들을 제공합니다. 위에서 소개한 최신 업데이트와 새로운 기능들을 적절히 활용하면 데이터 처리 작업을 효율적으로 수행할 수 있습니다. 자바 개발자라면 스트림 API의 최신 동향을 주시하고 적극적으로 활용하는 것이 좋습니다.

참고 자료