Java Streams:将集合组织到地图中并选择最小的键

Ice*_*nte 6 java java-8 java-stream

我很确定这在一行中是不可能的,但我只是想检查一下:

List<WidgetItem> selectedItems = null;
Map<Integer, List<WidgetItem>> itemsByStockAvailable = WidgetItems.stream()
     .collect(Collectors.groupingBy(WidgetItem::getAvailableStock));
selectedItems = itemsByStockAvailable.get(
     itemsByStockAvailable.keySet().stream().sorted().findFirst().get());
Run Code Online (Sandbox Code Playgroud)

基本上我将所有小部件项目收集到一个地图中,其中关键字是availableStock数量,值是具有该数量的所有小部件的列表(因为多个小部件可能具有相同的值).有了这张地图后,我想选择与最小键对应的地图值.创建Map的中间步骤不是必需的,这是我能想到的唯一方法.

Tun*_*aki 6

您希望保留所有以最低可用库存分组的窗口小部件项目.在这种情况下,您可以将分组数据收集到a中,TreeMap以确保基于库存值增加的排序并检索第一个条目firstEntry()

List<WidgetItem> selectedItems = 
    widgetItems.stream()
               .collect(Collectors.groupingBy(
                  WidgetItem::getAvailableStock,
                  TreeMap::new,
                  Collectors.toList()
               ))
               .firstEntry()
               .getValue();
Run Code Online (Sandbox Code Playgroud)

优点是它完成了初始列表的一次通过.

  • 如果你想把所有东西都塞进一个流中,你也可以做`Collectors.collectingAndThen(Collectors.groupingBy(...),x - > x.firstEntry().getValue())` (3认同)