[ Stream API ]
java.util.stream 패키지에 포함. java 8 부터 추가.
데이터의 흐름을 다루기 위한 추상화 계층을 제공하며, 이를 통해 데이터의 필터링, 매핑, 정렬, 집계와 같은 작업을 함수형 프로그래밍 방식으로 수행할 수 있다.
[ 종류 ]
- Stream<T> : 일반적인 객체 스트림
- IntStream, LongStream, DoubleStream : 기본형(int, long, double)에 특화된 스트림.
[ 주요 메소드 ]
* 중간 작업 (Intermediate Operations)
- filter() : 조건에 맞는 요소를 필터링.
- map() : 각 요소를 변환하여 새로운 스트림 생성.
- sorted() : 요소 정렬.
- distinct() : 중복 요소 제거.
* 최종 작업 (Terminal Operations)
- forEach() : 각 요소에 대해 특정 동작 수행.
- collect() : 리스트, 셋, 맵 등 컬렉션 형태로 결과 반환.
- reduce() : 누적 연산을 통해 하나의 결과 생성.
- count(), findFirst(), findAny() : 요소 수나 특정 요소를 반환.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave", "Alice");
// Stream을 이용하여 필터링 및 수집
List<String> result = names.stream()
.distinct() // 중복 제거
.filter(name -> name.length() > 3) // 이름 길이가 3 이상인 것만 필터링
.sorted() // 정렬
.collect(Collectors.toList()); // List로 수집
System.out.println(result); // 결과 출력
}
}
names.stream() 을 호출 => 스트림 생성
distinct(), filter(), sorted() 중간 작업 수행. => 스트림 변환
collect() 최종 작업 수행. => 스트림 사용
[ Collectors ]
java.util.stream.Collectors 에서 제공하는 클래스, stream API와 함께 사용하여 스트림의 결과를 쉽게 가공.
- toList() : 스트림의 요소들을 List로 수집.
List<String> list = stream.collect(Collectors.toList());
- toSet() : 스트림의 요소들을 Set으로 수집. (중복값 제거)
Set<String> set = stream.collect(Collectors.toSet());
- toMap() : 스트림의 요소들을 키-값 쌍으로 Map에 수집.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
Map<Integer, String> map = names.stream()
.collect(Collectors.toMap(
String::length, // 키 생성: 문자열의 길이
Function.identity() // 값 생성: 문자열 자체
// name -> name // 값생성을 람다식으로 표현
));
:: 메소드 참조 연산자
특정 메소드나 생성자를 간결하게 참조하는 표현식. 람다 표현식의 단순화를 위해 자주 사용. (불필요한 매개변수 제거)
클래스이름::메소드이름 or 참조변수이름::메소드이름
- joining() : 스트림의 문자열 요소를 하나로 이어 붙임.
String result = stream.collect(Collectors.joining(", ", "[", "]"));
- groupingBy() : 스트림의 요소를 특정 기준에 따라 그룹화하여 Map으로 반환.
Map<Integer, List<String>> groupedByLength = stream.collect(
Collectors.groupingBy(String::length) // 문자열 길이로 그룹화
);
- partitioningBy() : 스트림의 요소를 조건에 따라 두 개의 그룹으로 나누어 Map으로 반환.
Map<Boolean, List<String>> partitioned = stream.collect(
Collectors.partitioningBy(s -> s.length() > 3) // 길이가 3보다 큰지 여부로 분할
);
- counting() : 스트림의 요소 개수 카운트.
long count = stream.collect(Collectors.counting());
- summarizingInt() : 스트림의 요소에서 int형 값의 요약 통계를 계산. (합계, 평균, 최대, 최소)
IntSummaryStatistics stats = stream.collect(Collectors.summarizingInt(String::length));
'Java > 공부공부' 카테고리의 다른 글
[기타] System.out.println 실무에서 사용하면 안되는 이유 (0) | 2024.11.16 |
---|---|
[Java] 자바에서 리눅스 명령어 실행 (JSch , Session , ChannelExec ) (0) | 2024.11.06 |
[JAVA] objectMapper, modelMapper (0) | 2024.10.25 |
[JAVA] 리플렉션 (Relection) (0) | 2024.10.25 |
[JAVA/JSP] jsp include (0) | 2024.10.16 |