使用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) ,从每个Itemuuid生成密钥,将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());