Java 8 버전부터 도입된 Stream API는 자바에서 함수형 프로그래밍을 가능하게 해주는 강력한 기능이다. 이는 데이터를 처리하는 방식에 혁신을 가져왔으며, 코드의 간결함과 가독성을 높이는 데 큰 기여를 한다. 특히 람다 표현식과 함께 사용하면 복잡한 데이터 처리 로직을 매우 직관적으로 표현할 수 있다.
Collection은 모든 값을 메모리에 저장하는 자료구조로, 모든 데이터가 메모리에 미리 준비되어 있어야 한다. 반면에 Stream은 요청할 때만 요소를 계산하여 메모리 사용을 최소화한다. 이러한 차이로 인해 Stream은 데이터를 실시간으로 처리하거나 대량의 데이터를 다룰 때 유리하다.
Stream을 활용하면 데이터 처리 작업을 간결하고 효율적으로 수행할 수 있다.
외부 반복: 사용자가 직접 루프를 사용하여 데이터를 반복적으로 처리해야 한다. 이 방식은 명시적이고 직관적이지만, 병렬 처리가 어렵다.
내부 반복: 스트림 라이브러리가 데이터 처리를 대신 수행한다. 병렬 처리가 가능하며, 코드가 간결해진다.
// 외부 반복 예시
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
for (String name : names) {
System.out.println(name.toUpperCase());
}
// 내부 반복 예시 (Stream 사용)
names.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
스트림 연산은 두 가지로 나뉜다: 중간 연산과 최종 연산.
중간 연산은 스트림을 반환하며, 중첩하여 사용이 가능하다.
최종 연산은 스트림을 소비하여 결과를 반환한다.
Optional은 값의 존재 여부를 명확하게 나타내기 위한 컨테이너 클래스다. null로 인한 오류를 방지하고 더 안전한 코드를 작성하는 데 도움을 준다.
Optional<String> optionalName = Optional.of("Alice");
optionalName.ifPresent(System.out::println); // 값이 있을 때만 출력
List<String> words = Arrays.asList("stream", "api", "java");
List<String> upperCaseWords = words.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperCaseWords); // [STREAM, API, JAVA]
List<String> words = Arrays.asList("apple", "banana", "cherry");
List<String> filteredWords = words.stream()
.filter(word -> word.startsWith("b"))
.collect(Collectors.toList());
System.out.println(filteredWords); // [banana]
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
int sum = numbers.reduce(0, Integer::sum);
System.out.println("Sum: " + sum); // Sum: 15
List<String> words = Arrays.asList("java", "stream", "collect");
String concatenated = words.stream()
.collect(Collectors.joining(", "));
System.out.println(concatenated); // java, stream, collect
Stream API는 자바에서 데이터 처리의 새로운 패러다임을 제공한다. 이를 통해 코드를 더 직관적이고, 간결하게 작성할 수 있으며, 특히 대량 데이터 처리에서 강력한 성능을 발휘할 수 있다. 중간 연산과 최종 연산을 조합하여 복잡한 데이터 흐름을 선언적으로 표현할 수 있으며, 이는 가독성과 유지보수성을 크게 향상시킨다. Streams를 활용하면 병렬 처리도 쉽게 구현할 수 있어, 현대적인 데이터 처리 요구를 충족시키는 데 매우 유용하다.