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와 크게 다르지 않다는 것을 인식해 주셨으면 좋겠습니다. ㅎㅎ

 

감사합니다!