hanker

JAVA - stream 본문

JAVA

JAVA - stream

hanker 2024. 9. 13. 13:30
반응형

Java의 Stream은 Java 8에서 도입된 기능으로, 데이터 컬렉션(List, Set, Map 등) 또는 배열에 대해 다양한 연산을 처리할 수 있다.

 

 

Stream은 중간 연산(Intermediate Operation)과 최종 연산(Terminal Operation)으로 나뉜다.

중간연산은 조건, 최종연산은 결과 값이다.

1. 중간 연산 (Intermediate Operation)

  • filter(Predicate<T>): 조건에 맞는 요소만을 필터링
  • map(Function<T, R>): 요소를 다른 타입으로 변환
  • sorted(): 요소를 정렬
  • distinct(): 중복 요소 제거
  • limit(long n): 처음 n개만을 추출
  • skip(long n): 처음 n개를 건너뜀

2. 최종 연산 (Terminal Operation)

  • forEach(Consumer<T>): 각 요소를 순회하면서 동작 수행
  • collect(Collector<T, A, R>): 결과를 List, Set, Map 등으로 수집
  • count(): 요소의 개수를 반환
  • reduce(BinaryOperator<T>): 요소를 누적하여 하나의 값으로 변환
  • findFirst(), findAny(): 첫 번째 요소 또는 임의의 요소를 반환
  • allMatch(Predicate<T>), anyMatch(Predicate<T>), noneMatch(Predicate<T>): 조건을 만족하는지 여부를 검사

 

이해를 위해 예제를 보면서 확인하자

List<Map<String, Object>> list = new ArrayList<>();


String[] name = {"김철수", "김민수", "이재훈", "박상현", "허진", "john"};
String[] age = {"22", "31", "27", "23", "25", "33"};
String[] gender = {"male", "female", "female", "male", "male", "male"};
String[] country = {"korea", "korea", "korea", "korea", "korea", "USA"};

for(int i = 0; i < name.length; i++) {
    Map<String ,Object> map = new HashMap<>();

    map.put("name", name[i]);
    map.put("age", age[i]);
    map.put("gender", gender[i]);
    map.put("country", country[i]);

    list.add(map);
}

- 예제 데이터 생성

 

filter()

Gender가 'male'인 경우 또는 country가 'korea'인 경우

List<Map<String, Object>> result = list.stream()
        .filter(map -> map.get("gender").equals("male"))
        .filter(map -> map.get("country").equals("korea"))
        .collect(Collectors.toList());

 

결과.

 

 

map()

'name' 키와 연관된 값으로 매핑

List<Object> result = list.stream()
        .filter(map -> map.get("gender").equals("male"))
        .map(map -> map.get("name"))
        .collect(Collectors.toList());

결과.

 

sorted()

정렬

List<Object> result = list.stream()
        .sorted(Comparator.comparing(map -> Integer.parseInt(map.get("age").toString())))
        .collect(Collectors.toList());

 

 

distinct()

성별 중복제거

List<Map<String, Object>> result = list.stream()
        .collect(Collectors.toMap(
                map -> map.get("gender"), // keyMapper: age 값을 key로 사용
                map -> map,            // valueMapper: 현재 map을 value로 사용
                (existing, replacement) -> existing // 중복 발생 시 기존 값 사용
        )).values()
        .stream()
        .collect(Collectors.toList());

결과.

 

 

limit()

2개만 출력

List<Map<String, Object>> result = list.stream()
        .limit(2)
        .collect(Collectors.toList());

 

결과.

 

 

skip()

처음 2개 건너뛰고 출력

List<Map<String, Object>> result = list.stream()
        .skip(2)
        .collect(Collectors.toList());

결과.

끝.

반응형