【问题标题】:List to BiMap in Java 8Java 8 中的 BiMap 列表
【发布时间】:2015-08-11 22:00:12
【问题描述】:

我有一个输入类型:List<List<String>>

示例输入:

[A, A1Name]
[B, B1Name]

我想把它转换成 BiMap

A -> A1Name
B -> B1Name

实现这一目标的最佳方法是什么:

目前我在做:

final BiMap<String, String> myMap = HashBiMap.create();
lines.forEach(
    (tokens) -> {
        myMap.put(tokens.get(0), tokens.get(1));
    }
);

【问题讨论】:

  • 我看不出你有什么问题。
  • 我在想,如果有什么方法可以利用 stream.map() 或 stream.collect()
  • BiMap 没有标准的收集器,因为它不是标准的 Java 类,而且 Guava 还没有针对 Java 8。您可以编写自己的收集器,但是当这 3 行代码完成这项工作时,何必费心呢?
  • 有很多 ad hoc libraries 为 Guava 提供 Java 8 收集器作为桥梁,直到得到官方支持。

标签: java lambda java-8 guava collectors


【解决方案1】:

由于BiMap 实现了Map,您可以使用toMap 收集器。要复制循环的行为(重复键默默地覆盖值,重复值抛出异常),您可以执行以下操作:

BiMap<String,String> m = lines.stream().collect(toMap(
    x->x.get(0), x->x.get(1), (a,b)->b, HashBiMap::create
));

顺便说一句,当您不确定如何将代码转换为流时,3-argument collect 提供了一种几乎逐字转换迭代代码的方法:

BiMap<String,String> m = lines.stream().collect(
        HashBiMap::create,
        (bm,t) -> bm.put(t.get(0), t.get(1)),
        BiMap::putAll
);

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2017-06-21
    • 2015-09-08
    • 2020-03-31
    相关资源
    最近更新 更多