2025.03.10
컬렉션(자료구조)에 저장된 엘리먼트(요소)들을 하나씩 순회하면서 처리할 수 있는 기능
데이터들 -> 조건으로 거르기 -> 형태 바꾸기 -> 결과 만들기
자주 사용하는 배열과 컬렉션 객체에서 stream() 메소드 지원
배열 : 스트림을 생성할 배열을 생성한 후 stream() 사용
Stream
<T>참조변수명 = Arrays.stream(배열명);
Stream<T>참조변수명 = Arrays.stream(배열명, 시작인덱스, 끝인덱스);
컬렉션 : 컬렉션 생성 후 stream() 사용 -> 컬렉션의 경우 일부 메서드 체이닝에서 바로 .stream()을 붙여 사용할 수 있다.
Stream
<T>참조변수명 = 컬렉션명.stream();
비어있는 스트림 : 요소가 없을 때 사용

문자 관련 스트림
스트림 합치기
스트림에서는 데이터를 가공할 수 있는 메소드를 제공, 해당 메소드들은 Stream을 전달받아 Stream을 반환하므로 연속해서 메소드를 연결할 수 있다.

스트림에서 특정 데이터만 걸러내는 메소드
Stream filter(Predicate<? super T> predicate);
스트림변수명.filter(조건).
스트림에 들어있는 데이터를 특정 람다식을 통해 데이터를 가공하고 새로운 스트림에 담아주는 역할
Stream map(Function<? super T, ? extends R> mapper);
스트림변수명.filter(조건).map(추가가공).
중첩 구조를 한 단계 제거하고 단일 컬렉션으로 만들어준다. -> 플래트닝(flattening)
컬렉션명.stream().flatMap(Collection::stream).collect(Collectors.to컬렉션());
인자가 없이도 호출이 가능한데, 인자가 없으면 오름차순으로 자동 정렬
Stream sorted();
Stream sorted(Comparator<? super T> comparator);
가공된 스트림을 통해 결과를 만들어 내는 작업

최소/최대/총합/평균 등 과 같은 결과
reduce() 라는 메소드는 스트림에 있는 데이터들의 총합을 계산
Optional reduce(BinaryOperator accumulator);
collect() 는 Collector 타입을 받아서 처리하는데, 해당 메소드를 통해 컬렉션을 출력으로 받을 수 있다.
collect() 메소드는 Collector 객체에서 제공하는 정적 메소드를 사용할 수 있다.
boolean anyMatch(Predicate<? super T> predicate); // 하나라도 조건을 만족하는 값이 있는지
boolean allMatch(Predicate<? super T> predicate); // 모든 조건을 만족하는지
boolean noneMatch(Predicate<? super T> predicate); // 모든 조건을 만족하지 않는지
List<String> names = List.of("kim", "lee", "park", "kang");
List<String> result = names.stream()
<!-- 리스트를 스트림으로 바꿈 -->
.filter(name -> name.length() >= 4)
<!-- 길이가 4 이상인 것만 남김 -->
.map(name -> name.toUpperCase())
<!-- 남은 값을 대문자로 바꿈 -->
.collect(Collectors.toList());
<!-- 다시 List로 모음 -->
-> 결과 : ["PARK", "KANG"]
stream() : 데이터 흐름 만들기
filter() : 조건에 맞는 것만 남기기
map() : 값을 다른 형태로 바꾸기
sorted() : 정렬하기
collect() : 결과를 컬렉션으로 모으기
forEach() : 하나씩 꺼내서 실행하기