如何在Stream.collect中为HashMap使用双冒号?

时间:2014-03-21 08:23:17

标签: java lambda java-8

我想通过将第一列用作键,将第二列用作值,并忽略第三列,将csv文件读入哈希映射。

我编写了以下代码并且它有效。我想知道如何用双冒号" ::"重写语法。

我检查API文档,但大多数示例都使用List而不是Map。

我使用字符串来模拟csv文件:" A,1,!"," B,2,@"," C,3,# "" d,4,$"" E,5,%"

Map<String,String> maps = Stream.of("A,1,!","B,2,@","C,3,#","D,4,$","E,5,%")
      .collect(() -> new HashMap<String,String>(),
               (map, line) -> {String x[] = line.split(","); map.put(x[0],x[1]);},
               (map1, map2) -> map1.putAll(map2));
System.out.println(maps);

谢谢,
伊恩

2 个答案:

答案 0 :(得分:4)

我个人会这样做:

Map<String, String> maps = Stream.of("A,1,!", "B,2,@", "C,3,#", "D,4,$", "E,5,%").
        map(line -> line.split(",")).
        collect(HashMap::new, (map, line) -> map.put(line[0], line[1]), HashMap::putAll);

即。将逻辑分离成不同的流转换操作。在map中执行collect云代码的意图。

答案 1 :(得分:4)

我认为您不希望将混凝土collect()与供应商,累加器和组合器一起使用。
您应该更多地依赖更高级别的方法,这就变成了:

Map<String, String> map = Stream.of("A,1,!","B,2,@","C,3,#","D,4,$","E,5,%")
        .map(line -> line.split(","))
        .collect(Collectors.toMap(
                array -> array[0],
                array -> array[1]
        ));

以下是:

  1. 创建Stream<String>
  2. 将其映射到Stream<String[]>
  3. 通过Collectors.toMap收集结果,该array将关键映射器和值映射器作为参数。
    1. 我在此处将array[0]映射到array以获取密钥。
    2. 在此,我将值array[1]映射到map.forEach((k, v) -> System.out.println("Key = " + k + " / Value = " + v));
  4. 然后确认它有效我打印:

    {{1}}

    给出了:

      

    键= A /值= 1
      键= B /值= 2
      键= C /值= 3
      键= D /值= 4
      键= E /值= 5