使用Java流的一对一地图

jwi*_*ner 7 java java-8 java-stream

使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要一个Map<String, Item>容易的查找.但鉴于此Stream<Item>,似乎没有一种简单的方法可以实现Map<String, Item>.

显然,Map<String, List<Item>>不是没有的事情:

public static Map<String, List<Item>> streamToOneToMany(Stream<Item> itemStream) {
    return itemStream.collect(groupingBy(Item::getUuid));
}
Run Code Online (Sandbox Code Playgroud)

这是更安全更普遍的情况,但在这种情况下我们确实知道只会​​有一对一的情况.我找不到任何可编译的东西 - 我特意试图将downstream参数设置为muck Collectors.groupingBy.就像是:

// DOESN'T COMPILE
public static Map<String, Item> streamToOneToOne(Stream<Item> itemStream) {
    return itemStream.collect(groupingBy(Item::getUuid, Function.identity()));
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Sot*_*lis 12

使用Collectors#toMap(Function, Function),从而产生从每个键ItemuuidItem作为值本身.

public static Map<String, Item> streamToOneToOne(Stream<Item> itemStream) {
    return itemStream.collect(Collectors.toMap(Item::getUuid, Function.identity()));
}
Run Code Online (Sandbox Code Playgroud)

来自javadoc的注释

如果映射的键包含重复项(根据 Object.equals(Object)),IllegalStateException则在执行收集操作时抛出a.如果映射的键可能有重复,请toMap(Function, Function, BinaryOperator)改用.