Java Stream
은 컬렉션, 배열 등의 데이터를 다룰 때 사용되는 API로서, 람다식과 함수형 인터페이스를 이용하여 데이터 처리를 더욱 간결하고 효율적으로 할 수 있도록 지원합니다.
Stream 개요
Stream은 크게 중간 연산과 최종 연산으로 구성됩니다. 중간 연산은 Stream을 반환하며, 최종 연산은 다른 타입의 값을 반환합니다. 이때, 최종 연산이 수행되기 전까지는 중간 연산이 실행되지 않습니다.
Stream API에서 제공하는 대표적인 중간 연산과 최종 연산은 다음과 같습니다.
중간 연산
- filter(Predicate predicate): 조건에 맞는 요소만을 Stream에 남깁니다.
- map(Function<T, R> mapper): 각 요소를 매핑하여 Stream을 반환합니다.
- flatMap(Function<T, Stream> mapper): 각 요소를 매핑하여 새로운 Stream을 반환하고, 이를 하나의 Stream으로 병합합니다.
- distinct(): 중복된 요소를 제거합니다.
- sorted(): 요소를 정렬합니다.
- peek(Consumer action): 각 요소에 작업을 수행하고 Stream을 반환합니다.
최종 연산
- count(): 요소의 개수를 반환합니다.
- forEach(Consumer action): 각 요소에 대해 작업을 수행합니다.
- reduce(BinaryOperator accumulator): 모든 요소를 하나의 값으로 줄입니다.
- collect(Collector<T, A, R> collector): Stream의 요소를 수집하여 새로운 컬렉션을 생성합니다.
- anyMatch(Predicate predicate): 최소한 하나의 요소가 조건을 만족하는지 검사합니다.
- allMatch(Predicate predicate): 모든 요소가 조건을 만족하는지 검사합니다.
- noneMatch(Predicate predicate): 요소가 하나도 조건을 만족하지 않는지 검사합니다.
예시 코드
다음은 Stream API를 사용한 예시 코드입니다.
import java.util.Arrays;
import java.util.List;
import java.util.OptionalInt;
public class StreamExample {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "orange", "kiwi");
// 문자열 길이가 5 이상인 요소만 필터링하여 새로운 리스트 생성
List<String> filteredFruits = fruits.stream()
.filter(s -> s.length() >= 5)
.collect(Collectors.toList());
System.out.println(filteredFruits);
// 모든 요소를 연결하여 하나의 문자열로 반환
String concatenated = fruits.stream()
.reduce("", (a, b) -> a + ", " + b);
System.out.println(concatenated);
// 가장 긴 문자열의 길이 반환
OptionalInt longestLength = fruits.stream()
.mapToInt(String::length)
.max();
System.out.println(longestLength.orElse(0));
}
}
위 예시 코드에서는 List<String>
형태의 컬렉션에서 Stream을 생성하여 다양한 연산을 수행하고 있습니다. 예를 들어, filter()
메소드를 이용하여 문자열 길이가 5 이상인 요소만을 필터링하여 새로운 리스트를 생성하고 있습니다. 이 외에도 reduce()
메소드를 이용하여 모든 요소를 하나의 문자열로 연결하고, mapToInt()
메소드를 이용하여 문자열 길이를 int형으로 변환한 후, 이 중에서 최댓값을 구하는 등의 다양한 연산을 수행할 수 있습니다.
결론
Java Stream
은 다양한 데이터 처리 작업을 간결하고 효율적으로 처리할 수 있도록 지원하는 API입니다. Stream API를 잘 활용하면 코드를 간결하게 작성할 수 있고, 성능도 개선할 수 있습니다. 다양한 중간 연산과 최종 연산을 조합하여 필요한 작업을 수행할 수 있으며, 이를 활용하면 다양한 데이터 처리 작업을 더욱 쉽고 간결하게 수행할 수 있습니다.
'java' 카테고리의 다른 글
자바 메모리 구조 (0) | 2023.08.16 |
---|---|
함수형 인터페이스 (0) | 2023.04.06 |
블로킹(Blocking)? 논블로킹(Non-Blocking)? (1) | 2023.03.07 |
어노테이션(Annotation) 이란? (1) | 2022.07.11 |
J2EE란? (1) | 2022.05.30 |