자바의 스트림은 컬렉션과 배열 등의 데이터를 다루는데 사용되는 시퀀스이다. 스트림은 요소들의 연속된 흐름을 나타내며, 이를통해 데이터를 조작하고 처리한다.
스트림은 크게 두가지 유형의 작업을 수행한다.
중간 작업(Intermediate Operations) : 스트림에 대해 연속적으로 적용되고, 다른 스트림들을 반환한다.(filter, map, sorted)
filter() : 조건에 맞는 요소만 필터링, if문과 for문을 합친것과 같다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
// 결과: evenNumbers = [2, 4, 6]```
map() : 각 요소를 다른 요소로 매핑한다.
List<String> names = Arrays.asList("John", "Alice", "Bob");
List<Integer> nameLengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
// 결과: nameLengths = [4, 5, 3]```
sorted() : 요소들을 정렬한다.
List<Integer> sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList());
// 결과: sortedNumbers = [1, 2, 3, 4, 5]
최종 작업(Terminal Operations) : 스트리의 최종결과를 반환한다. 더이상은 스트림을 사용할 수 없게한다.(연산을 다시 수행하려면 스트림을 다시생성해야한다. collect, count, forEach 등이 있다.)
collect() : 스트림을 다른 형태(컬렉션, 맵, 리스트 등) 로 변환한다.
Set<String> fruitSet = fruits.stream()
.collect(Collectors.toSet());
// 결과: fruitSet = {"Apple", "Banana", "Orange"}
forEach() : 각 요소에 대해 특정 동작을 수행한다. 반환값을 가지고 있지 않다.
colors.stream()
.forEach(color -> System.out.println("Color: " + color));
// 결과: Color: Red, Color: Green, Color: Blue (콘솔 출력)
reduce : 모든 요소를 하나의 값으로 줄인다.(sum(), max(), min())
-sum
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum);
// 결과: sum = 15
-max
List<Integer> numbers = Arrays.asList(3, 1, 5, 2, 4);
int max = numbers.stream()
.reduce(Integer.MIN_VALUE, Integer::max);
// 결과: max = 5
-min
List<Integer> numbers = Arrays.asList(3, 1, 5, 2, 4);
int min = numbers.stream()
.reduce(Integer.MAX_VALUE, Integer::min);
// 결과: min = 1
이러한 스트림 연산은 다양한 데이터 처리 및 변환에 사용되며, 함수형 프로그래밍의 장점을 살려 코드를 간결하게 만들어준다.