Backend/JAVA&JAVA8
[JAVA8] group by
GreatSaiyaman
2022. 5. 5. 14:07

오늘은 마치 sql문의 group by 문처럼 자신이 원하는 데이터들을 묶어주어서 Collections로 반환하는 groupBy 메소드에 대해서 알아보겠습니다.
어렵게 생각하실 필요가 없습니다.
백문이 불여일타라고 하죠? 코드로 직접 알아보겠습니다.
1. 재료가 될 class를 준비합니다.
static class Item {
private String name;
private int qty;
private BigDecimal price;
Item(String name, int qty, BigDecimal price) {
this.name = name;
this.qty = qty;
this.price = price;
}
public String getName() {
return name;
}
public Integer getQty() {
return qty;
}
public BigDecimal getPrice() {
return price;
}
public void setName(String name) {
this.name = name;
}
public void setQty(int qty) {
this.qty = qty;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
2. main 메소드 안에, 전자기기 관련된 아이템을 삽입합니다.
public static void main(String[] args) {
List<Item> items = Arrays.asList(
new Item("apple", 10, new BigDecimal("10"))
, new Item("samsung", 30, new BigDecimal("20"))
, new Item("logitec", 20,new BigDecimal("30"))
);
}
이로써 기능 구현을 위한 물밑작업은 끝났습니다.
3. 그렇다면 각각의 제품이 몇 개인지 counting 하는 메소드를 사용하여 각각의 제품이 몇 개인지 출력해보겠습니다. 퀴리 문과 매우 비슷합니다.
System.out.println(
items
.stream()
.collect(
Collectors.groupingBy(Item::getName, Collectors.counting())
)
);
출력 결과는 아래와 같습니다.
{apple=1, samsung=1, logitec=1}
4. 다음은 Item 객체에서 summingInt 메소드를 사용하여 가격만을 출력해보겠습니다.
System.out.println(
items
.stream()
.collect(
Collectors.groupingBy(
Item::getName,
Collectors.summingInt(Item::getQty)
)
)
);
출력 결과는 아래와 같습니다.
{apple=10, samsung=30, logitec=20}
4. 다음은 Item 객체에서 가격을 빼오되, 그 가격에 해당하는 이름을 set으로 바꿔서 표시해보겠습니다.
간단하게 List를 Set으로 바꿔서 표기해 준다고 생각해 주시면 됩니다.
System.out.println(
items
.stream()
.collect(
Collectors.groupingBy(
Item::getPrice,
Collectors.mapping(Item::getName, Collectors.toSet())
)
)
);
출력 결과는 아래와 같습니다.
{30=[logitec], 10=[apple], 20=[samsung]}
너무 간단한가요?
이번 포스팅으로 groupBy 함수가 DB에서 사용하는 groupBy와 크게 다르지 않다는 것을 인식해 주셨으면 좋겠습니다. ㅎㅎ
감사합니다!