스트림은 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식으로 처리한다.
스트림은 데이터 처리에 중점을 둔다.
1.스트림은 람다식으로 데이터를 처리한다.
2.스트림은 자바에서 제공하는 유용한 메서드(+ 함수형 인터페이스)들을 사용한다.
스트림은 중간연산과 최종연산으로 나뉜다.
중간연산의 경우 stream을 다시 return하며,
최종연산은 stream이 아닌것을 반환한다.
중간연산의 종류
1.filter() -stream에서 조건이 맞는 데이터만을 정제하여 더 작은 컬렉션을 만드는데 사용한다. 새로운 stream을 만들어낸다.
import java.util.stream.Stream;
public class FilterDemo {
public static void main(String[] args) {
Stream.of("a1", "b1", "b2", "c1", "c2", "c3")
.filter(s -> s.startsWith("c")).skip(1)
.forEach(System.out::println);
}
}
2.map() - 기존의 stream 요소들을 대체하는 요소로 구성된 새로운 stream을 만들어낸다.
import java.util.List;
import java.util.stream.Collectors;
public class StreamMapExample {
public static void main(String[] args) {
List<String> names = List.of("Alice", "Bob", "Charlie");
// 각 이름을 대문자로 변환
List<String> upperNames = names.stream()
.map(name -> name.toUpperCase()) // map으로 변환
.collect(Collectors.toList()); // 최종 연산
System.out.println(upperNames); // 출력: [ALICE, BOB, CHARLIE]
3.sorted()- Stream의 요소들을 정렬하기 위해 사용한다. 인자 없이 호출할 경우 오름차순 정렬이다.
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class SortedEx {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
// 오름차순 정렬
list.stream()
.sorted()
.forEach(System.out::print);
4.peek() - forEach()처럼 요소를 하나씩 돌며 출력하지만, 중간연산이다.
(forEach()는 최종연산)
import java.util.Arrays;
import java.util.List;
public class PeekEx {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int result = list.stream()
.filter(num -> num % 2 == 0)
.peek(num -> System.out.println(num))
5.limit() -- ()안의 숫자만큼 요소들을 가져와 새로운 스트림을 형성한다.
public class LimitEx {
public static void main(String[] args) {
IntStream intStream = IntStream.rangeClosed(1, 10);
intStream.limit(5) //1,2,3,4,5
.forEach(System.out::println);
}
}
최종연산- 연산결과가 스트림이 아니므로, 한번만 연산이 가능하다.
public class FilterDemo {
public static void main(String[] args) {
Stream.of("a1", "b1", "b2", "c1", "c2", "c3")
.filter(s ->s.startsWith("c"))
.skip(1)
.forEach(System.out::println); //중간연산후 모든 요소 출력
/*출력값:
c2
c3 */
}
}
2.sum(), count(), average(), max(), min() - 집계에 대한 연산이다.
public class ScammEx {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
long count = Arrays.stream(arr).count();
System.out.println(count);
long sum = Arrays.stream(arr).sum();
System.out.println(sum);
double avg = Arrays.stream(arr).average().getAsDouble();
System.out.println(avg);
int max = Arrays.stream(arr).max().getAsInt();
System.out.println(max);
int min = Arrays.stream(arr).min().getAsInt();
System.out.println(min);
}
}
3.reduce() - 스트림의 모든 요소를 하나로 합치는 최종 연산(terminal operation)이다.
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Optional<Integer> sum = numbers.reduce(Integer::sum);
sum.ifPresent(s -> System.out.println("sum: " + s));
4.collect() -요소들을 List, Set, Map 등 다른 종류의 결과로 수집할 때 사용한다.
collect() 메서드는 Collector 인터페이스를 구현한 클래스인 Collector 타입을 인자로 받는다.
import java.util.List;
import java.util.stream.Collectors;
public class CollectExample {
public static void main(String[] args) {
List<String> names = List.of("Alice", "Bob", "Charlie");
// 스트림 → 리스트로 수집
List<String> upperNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperNames); // 출력: [ALICE, BOB, CHARLIE]
}
}