스트림은 자바 8부터 도입된 기능으로, 요소들의 연속적인 처리를 위해 사용한다.
stream() : 컬렉션을 스트림으로 변환하는 메서드이다. 스트림을 이용하면 보다 간단하고 효율적인 데이터 처리가 가능하다.
다음과 같은 방식으로 컬렉션으로부터 스트림을 생성한다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = numbers.stream();
forEach() 메서드: 컬렉션의 각 요소에 대해 지정 작업을 반복 수행할 수 있는 메서드이다. 람다식이나 메서드 참조를 전달하여 사용한다.
filter() : 스트림에서 특정 조건을 만족하는 요소를 걸러내는 메서드로, 람다식을 전달하여 사용한다.
map() : 스트림의 각 요소를 특정 함수에 적용하여 새로운 요소로 매핑하는 메서드이다. 변환된 요소들로 새로운 스트림을 생성한다.
collect() : 스트림의 요소를 수집하여 컬렉션이나 다른 형태로 모을 수 있는 메서드이다. Collector 인터페이스를 구현한 객체를 전달하여 사용한다.
distinct(): 중복된 요소를 제거한 새로운 Stream을 반환한다.
sorted(): 요소들을 정렬한 새로운 Stream을 반환한다.
다음은 stream(), filter(), map(), forEach(), collect()를 이용한 예제이다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream() //스트림 생성
.filter(n -> n % 2 == 0) //짝수만 선택
.collect(Collectors.toList()); //요소를 모아 list로 반환
System.out.println(evenNumbers); // 출력: [2, 4]
List<Integer> squaredNumbers = numbers.stream()
.map(n -> n * n) //list의 각 요소를 제곱
.collect(Collectors.toList());
System.out.println(squaredNumbers); // 출력: [1, 4, 9, 16, 25]
numbers.stream()
.forEach(System.out::println); //각 요소 출력. 출력: 1 2 3 4 5
String numberString = numbers.stream()
.map(Object::toString)
.collect(Collectors.joining(", ")); ////각 요소들을 문자열로 결합
System.out.println(numberString); // 출력: 1, 2, 3, 4, 5