Java流操作

时间:2017-03-07 11:27:36

标签: java-8 java-stream

我有一个对象,“Item”包含字段: int:id 字符串:价格

字符串价格包含以逗号分隔的一个或多个价格值。

问题:使用流操作我想要一个Map<Integer,Set<Integer>>

类型List<Item> items的地图

其中Map的键是id,Set的值是从String价格中提取的Integer值。

列表中会有重复的ID,并且可以有不同的价格字符串。

我想出了一种产生以下结果的方法:

Map<Integer, Set<List<Integer>>> itemStoresMapIntermediate = items.stream()
            .collect(Collectors.groupingBy(Item::getItemId,Collectors.mapping(Item::getStoresAsIntList, Collectors.toSet())));

getStoresAsIntList()返回对象中String价格的价格值列表。

以上肯定不是我想要的。

1 个答案:

答案 0 :(得分:5)

如果我理解正确......

 Item item1 = new Item(1, "22,23,24");
 Item item2 = new Item(2, "33,34,35");
 Item item3 = new Item(1, "22,57,58");

 Map<Integer, Set<Integer>> map = Stream.of(item1, item2, item3)
            .collect(Collectors.toMap(
                    Item::getId,
                    i -> new HashSet<>(i.getStoresAsIntList()),
                    (left, right) -> {
                        left.addAll(right);
                        return left;
                    }, HashMap::new));

 System.out.println(map); // {1=[22, 23, 24, 57, 58], 2=[33, 34, 35]}