Java 8에서 도입된 스트림 API는 데이터 처리 작업을 간단하고 효율적으로 처리할 수 있도록 도와주는 기능입니다. 이후 여러 버전의 Java에서 스트림 API는 지속적으로 업데이트되어 새로운 기능과 개선된 성능을 제공하고 있습니다. 이번 글에서는 최신 업데이트와 새로운 기능들을 살펴보도록 하겠습니다.
1. takeWhile
및 dropWhile
메소드
Java 9에서 도입된 takeWhile
및 dropWhile
메소드는 스트림에서 특정 조건을 만족하는 요소들을 선택하거나 제외할 수 있도록 도와줍니다. 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의 최신 동향을 주시하고 적극적으로 활용하는 것이 좋습니다.