使用Java流的一对一地图
使用Stream API获取一对一映射时遇到一些麻烦。 基本上,说你上课了。
public class Item { private final String uuid; private Item(String uuid) { this.uuid = uuid; } /** * @return universally unique identifier */ public String getUuid() { return uuid; } }
我想要一个Map
以便于查找。 但是给定一个Stream
,似乎没有一种简单的方法来到达Map
。
显然, Map<String, List>
不是没有的东西:
public static Map<String, List> streamToOneToMany(Stream itemStream) { return itemStream.collect(groupingBy(Item::getUuid)); }
这是更安全更普遍的情况,但我们确实知道在这种情况下只会一对一。 我找不到任何可编译的东西 – 我特别试图将downstream
参数混淆为Collectors.groupingBy
。 就像是:
// DOESN'T COMPILE public static Map streamToOneToOne(Stream itemStream) { return itemStream.collect(groupingBy(Item::getUuid, Function.identity())); }
我错过了什么?
使用Collectors#toMap(Function, Function)
,从每个Item
的uuid
生成密钥,将Item
作为值本身生成。
public static Map streamToOneToOne(Stream- itemStream) { return itemStream.collect(Collectors.toMap(Item::getUuid, Function.identity())); }
来自javadoc的注释
如果映射的键包含重复项(根据
Object.equals(Object)
),则在执行集合操作时会抛出IllegalStateException
。 如果映射的键可能有重复,请改用toMap(Function, Function, BinaryOperator)
。
groupingBy()
通过键收集项目(复数,作为List
)。
你想要toMap()
:
public static Map streamToOneToOne(Stream- itemStream) { return itemStream.collect(toMap(Item::getUuid, Function.identity())); }
也许试试吧
itemStream.stream().collect(toMap(Item::getUuid,Functions.identity());