JAVA에서 Stream의 GroupingBy 사용하는 몇가지 예제이다.
GroupingBy 예제를 위한 Fruit Class
public class Fruit {
private final int id;
private final String name;
private final int quantity;
private final BigDecimal price;
public Fruit(final int id, final String name, final int quantity, final BigDecimal price) {
this.id = id;
this.name = name;
this.quantity = quantity;
this.price = price;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getQuantity() {
return quantity;
}
public BigDecimal getPrice() {
return price;
}
}
기본 데이터는 아래와 같다.
private final List<Fruit> fruits = new ArrayList<>();
@BeforeEach
public void beforeEach() {
fruits.add(new Fruit(1, "banana", 10, new BigDecimal(10)));
fruits.add(new Fruit(2, "banana", 20, new BigDecimal(20)));
fruits.add(new Fruit(3, "papaya", 10, new BigDecimal(40)));
fruits.add(new Fruit(4, "papaya", 20, new BigDecimal(50)));
fruits.add(new Fruit(5, "apple", 10, new BigDecimal(20)));
fruits.add(new Fruit(6, "apple", 20, new BigDecimal(30)));
fruits.add(new Fruit(7, "apple", 20, new BigDecimal(30)));
}
GroupingBy 기본적인 사용방법이며, Fruit Name을 기준으로 Grouping을 한다.
final Map<String, List<Fruit>> fruitMap = fruits.stream()
.collect(groupingBy(Fruit::getName));
assertNotNull(fruitMap);
assertEquals(fruitMap.get("banana").size(), 2);
Fruit Name 기준으로 Grouping을 하며 Collectors.summingInt()를 사용하여 수량을 더한 후 리턴한다.
final Map<String, Integer> summedFruitMap = fruits.stream()
.collect(groupingBy(Fruit::getName, Collectors.summingInt(Fruit::getQuantity)));
assertNotNull(summedFruitMap);
assertEquals(summedFruitMap.get("banana"), 30);
// {papaya=30, banana=30, apple=50}
Fruit Name 기준으로 Grouping을 하며, Collectors.collectionAndThen() 을 사용하여 중복된 데이터에 대해 제거한 후 1개의 element만 반환한다.
final Map<String, Fruit> duplicatedFruitMap = fruits.stream()
.collect(groupingBy(Fruit::getName,
Collectors.collectingAndThen(Collectors.toList(), values -> values.get(0))));
assertNotNull(duplicatedFruitMap);
assertThat(new BigDecimal(10)).isEqualTo(duplicatedFruitMap.get("banana").getPrice());
Fruit Name 기준으로 Grouping을 하며, Collectors.mapping()을 사용하여 수량을 Set으로 반환을한다.
final Map<String, Set<Integer>> likesPerNameFruitMap = fruits.stream()
.collect(groupingBy(Fruit::getName,
Collectors.mapping(Fruit::getQuantity, Collectors.toSet())));
assertNotNull(likesPerNameFruitMap);
assertEquals(likesPerNameFruitMap.get("apple").size(), 2);
// {papaya=[20, 10], banana=[20, 10], apple=[20, 10]}
'Develop > java,spring' 카테고리의 다른 글
git 명령어 (0) | 2020.12.01 |
---|---|
Okta(옥타) SSO(OIDC - Open ID Connect Application) 로그인 (1) | 2020.11.30 |
JAVA 버전별 특징 (1) | 2020.11.20 |
JAVA var 키워드 (0) | 2020.11.18 |
JPA 순환 참조 해결 방법 (0) | 2020.11.17 |