2017-09-21 2 views
3

와지도 결과 자바 8 개 스트림 및 채우기 사용하여 항목의 목록 그룹화 : 나는 항목과 I의 목록을 주어 졌어나는 다음 클래스에 의해 정의 된 항목이 첫 번째 항목이 아닌 목록

public class Item { 
    private int id; 
    private float price; 
} 

을 그룹을 id으로 그룹화해야합니다. 일단 그룹화, 나는 목록은 오직 각 ID에 대해 하나의 값이 포함됩니다 알고, 그래서 다음과 같이 나는 결과지도 정의 할 :

Map<Integer, Item> 

보다는 :

Map<Integer, List<Item>> 

의 장점

mapName.get (ID) 갔지 (0)

이 내 호출 코드가 추가 역 참조를 수행 할 필요가 없습니다 것입니다

Map<Integer, List<Item>> itemsMap = itemList.stream() 
     .collect(Collectors.groupingBy(Item::getId)); 

내 원하는 결과를 달성하기 위해 자바 8 방법이 있나요 : 목록이 포함 된지도 코드 의지 그룹 ID로 다음 항목을 만들?

답변

2
itemList.stream() 
    .collect(Collectors.toMap(item -> item.id, item -> item)); 
1

당신은 사용할 수 있습니다 Map<Integer, Item> itemsMap = items.stream().collect(Collectors.toMap(Item::getId, Function.<Item>identity()));

1

한 가지 방법은 IDE의 같은 인 IntelliJ 등을 사용하여 이러한 변환 주위해야 할 것은 : 다음

List<Item> itemList = ... 
Map<Integer, Item> itemMap = new HashMap<>(); 
for (Item item : itemList) { 
    itemMap.put(item.getId(), item); 
} 

및/변환으로 문을 대체 :

Map<Integer, Item> itemMap = 
      itemList.stream().collect(Collectors.toMap(Item::getId, item -> item, (a, b) -> b)); 

이는 John's answer과 동일합니다.

+1

좋은 지적. 나는 IDE의 기능을 미래에 의심이가는 경우 사용합니다. – gsdev

+1

OP가 단 하나의 항목 만 있다고 주장 할 때'(a, b) -> b '와 같은 병합 함수를 사용하지 않을 것입니다. 어쨌든 병합 함수를 지정하지 말고 어서션이 유지되지 않을 때 던져 버리거나 * (*, * b) -> a를 지정하여 마지막 * 목… – Holger