我想通过将第一列用作键,将第二列用作值,并忽略第三列,将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);
谢谢,
伊恩
答案 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]
));
以下是:
Stream<String>
。Stream<String[]>
。Collectors.toMap
收集结果,该array
将关键映射器和值映射器作为参数。
array[0]
映射到array
以获取密钥。array[1]
映射到map.forEach((k, v) -> System.out.println("Key = " + k + " / Value = " + v));
。然后确认它有效我打印:
{{1}}
给出了:
键= A /值= 1
键= B /值= 2
键= C /值= 3
键= D /值= 4
键= E /值= 5