Develop/java,spring

Java Stream GroupingBy 사용

kudl 2020. 11. 26. 16:06

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