java - 与 Java 流的一对一映射

标签 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;
    }
}

我想要一个 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));
}

这是更安全更一般的情况,但我们确实知道在这种情况下永远只会有一对一。虽然我找不到任何可以编译的东西——我一直在专门尝试处理 downstream参数 Collectors.groupingBy .像这样的东西:

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

我错过了什么?

最佳答案

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

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

来自 javadoc 的注释

If the mapped keys contains duplicates (according to Object.equals(Object)), an IllegalStateExceptionis thrown when the collection operation is performed. If the mapped keys may have duplicates, use toMap(Function, Function, BinaryOperator) instead.

关于java - 与 Java 流的一对一映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31640588/

相关文章:

Java对象赋值行为不一致?

java - 在java中使用静态变量

java-8 - Java8 向 LocalDateTime 添加小时不工作

Hibernate 无法在 Heroku postgres 上自动创建模式

reflection - Java8 流式传输类层次结构

java - SQL SELECT 和时间戳列

java - 在 Java 中处理 Content-Type = "application/x-www-form-urlencoded"的 SOAP 请求

java - 我可以通过作为流项目字段的 int 值的总数来限制 Java Stream 长度吗?

java - 按对象分组 - Java 流

java - 如何将 Java 8 Stream 转换为二维数组?