ysk(0soo)
Lifealong
ysk(0soo)
전체 방문자
오늘
어제
  • 분류 전체보기 (238)
    • Java (50)
      • whiteship-java-study (11)
      • Java (28)
      • time (6)
    • Spring (68)
      • JPA (15)
      • Spring (1)
      • SpringBoot (1)
      • SpringMVC (6)
      • Spring Security (22)
      • Jdbc (1)
      • RestDocs (14)
      • log (6)
    • Kotlin (3)
    • Web (2)
      • nginx (1)
    • Database (14)
      • MySQL (5)
      • PostgreSQL (1)
      • SQL (1)
      • Redis (4)
    • C, C++ (0)
    • Git (1)
    • Docker (2)
    • Cloud (3)
      • AWS (3)
    • 도서, 강의 (0)
      • t5 (0)
    • 기타 (7)
      • 프로그래밍 (1)
    • 끄적끄적 (0)
    • CS (14)
      • 운영체제(OS) (2)
      • 자료구조(Data Structure) (9)
    • 하루한개 (12)
      • 우아한 테크코스-10분테코톡 (12)
    • 스터디 (12)
      • 클린 아키텍처- 로버트마틴 (2)
      • JPA 프로그래밍 스터디 (10)
    • 테스트 (34)
      • JUnit (19)
      • nGrinder (2)
      • JMeter (0)
    • Infra (3)
    • 프로그래머스 백엔드 데브코스 3기 (0)
    • 디자인 패턴 (3)
    • Issue (4)
    • system (1)
      • grafana (0)
      • Prometheus (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

인기 글

태그

  • VirtualThread Springboot
  • 동일성
  • 정규표현식
  • AccessDecisionVoter 커스텀
  • mysql
  • java
  • StructuredConcorrency
  • 가상 스레드
  • UserDetailsService
  • restdocs enum
  • scope value
  • LocalDateTime
  • restdocs custom
  • tree
  • 가상 스레드 예외 핸들링
  • DataJpaTest
  • nGrinder
  • 동등성
  • AccessDecisionManager
  • jpa
  • 동시성 제어
  • 트랜잭션
  • nginx basic auth
  • AuthenticationException
  • 인가(Authorization) 처리
  • node exporter basic auth
  • querydsl
  • junit5
  • FilterSecurityInterceptor
  • 구조화된 동시성

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ysk(0soo)

Lifealong

Java/Java

# Java 그룹화, 그룹화 하고 정렬. Stream groupby, groupingBy, sorting Lists after groupingBy

2022. 9. 7. 11:59

Java Stream groupby, groupingBy, sorting Lists after groupingBy

Java 8 Stream을 이용하여 특정 키값으로 벨류 값 (Value List) 들을 모으는 방법과 그 요소들을 정렬 하는 방법

Java 8 grouping, sorting Lists after groupingBy

Java 8 Stream을 이용하여 특정 키값으로 벨류 값 (Value List) 들을 모으는 방법입니다.

Map<Key, List<Value>>
  • 특정 key 값으로 특정 key에 대응하는 요소 리스트를 Map으로 만들 수 있다.
  • 또한, 요소 리스트를 특정 프로퍼티의 속성에 맞게 정렬 할 수 있습니다

간단한 예제로, 게시물을 예제로 들어보겠습니다.

게시물 들의 값으로, 해당하는 값의 게시물들을 뽑아와야 하는 요구사항이 생겼습니다.

우리는 게시물의 리스트 List<Article>을 가지고 있습니다.

게시물의 리스트 List<Article>를 가격으로 묶은 Map 을 만들고 싶다면?

  • Java 8의 Stream 사용
  • Collectors 클래스의 정적 메서드 groupingBY 메서드입니다.
  • Collectors.groupingBy
  • groupingBy(classifier, toList()); -> classifier(분류자)로 List를 분류하여 그룹핑 할 수 있습니다.
  • 유형 T의 입력 요소에 대해 "그룹화 기준" 작업을 구현하고 분류 함수에 따라 요소를 그룹화하고 결과를 Map에 반환하는 Collector를 반환합니다.
  • 분류 함수는 요소를 일부 키 유형 K에 매핑합니다.
  • 수집기는 키가 입력 요소에 분류 함수를 적용한 결과 값이고 해당 값이 입력 요소를 포함하는 목록인 Map<K, List<T>>를 생성합니다.
  • 관련 키에 매핑됩니다.
  • 반환된 Map 또는 List 객체의 유형, 변경 가능성, 직렬화 가능성 또는 스레드 안전성에 대한 보장은 없습니다.
// Collectors Class
//groupingBy(classifier, toList());  
public static <T, K> Collector<T, ?, Map<K, List<T>>> 
  groupingBy(Function<? super T, ? extends K> classifier) {
  return groupingBy(classifier, toList());
}

게시물의 필드로는 ID값, 내용, 순서, 이름, 가격이 들어있습니다.

@Getter
@NoArgsConstructor    
@AllArgsConstructor
class Article {
  private Long id;        // id
  private String content; // 내용 
  private Integer order;  // 순서
  private String name;    // 이름
  private Integer price;  // 가격
}
  • 가격을 key 값으로, grouping 하고 싶다면?
// 가격을 key 값으로, grouping 하고 싶다면?
List<Article> articles;
​
Map<Integer, List<Article>> articlesGroupByPrice = articles.stream()
  .collect(Collectors.groupingBy(Article::getPrice));
  • 그렇다면 가격을 key값으로, key값에 해당하는 값들을 List로 묶고, 그 List 안에서 특정 필드를 기준으로 정렬을 하고 싶다면?
  • sorting Lists after groupingBy?
Map.values().forEach(list -> list.sort(Comparator.comparing(기준)));
  • 위 게시물을 기준으로, 가격대로 grouping하고, 그 가격 내에서 order 필드로 요소들을 정렬을 하고 싶다면?
//  가격대로 grouping하고, 그 가격 내에서 order 필드로  요소들을 정렬을 하고 싶다면?
List<Article> articles;
articlesGroupByPrice.values()
  .forEach(artcls -> artcls.sort(Comparator.comparing(Article::getOrder)));

'Java > Java' 카테고리의 다른 글

Java - 동일성과 동등성 ( ==, equals() )  (0) 2022.11.19
Java 박싱과 언박싱, 오토박싱 그리고 성능상 주의할점  (0) 2022.11.13
Java 람다표현식의 특징과 Scope, effectively final variable  (0) 2022.10.23
Java String Builder와 StringBuffer의 차이점  (0) 2022.10.21
Java String Pool (String Constant Pool) + String.intern()  (0) 2022.10.21
    'Java/Java' 카테고리의 다른 글
    • Java 박싱과 언박싱, 오토박싱 그리고 성능상 주의할점
    • Java 람다표현식의 특징과 Scope, effectively final variable
    • Java String Builder와 StringBuffer의 차이점
    • Java String Pool (String Constant Pool) + String.intern()
    ysk(0soo)
    ysk(0soo)
    백엔드 개발을 좋아합니다. java kotlin spring, infra 에 관심이 많습니다. email : kim206gh@naver.com github : https://github.com/devysk

    티스토리툴바