这是一个奇怪的要求。当您调用Arrays.asList(sContent.split(",")) 时,您已经有了一个数据结构,它将int 数字映射到它们的Strings。结果是List<String>,您可以在其上调用.get(intNumber) 来获得所需的值,就像使用Map<Integer,String> 一样......
但是,如果它确实必须是 Map 并且您想使用流 API,则可以使用
Map<Integer,String> map=new HashMap<>();
Pattern.compile(",").splitAsStream(sContent).forEachOrdered(s->map.put(map.size(), s));
为了解释它,Pattern.compile(separator).splitAsStream(string) 与Arrays.stream(string.split(separator)) 的作用相同,但不会创建中间数组,因此更可取。而且您不需要单独的计数器,因为地图本质上维护了这样一个计数器,即它的大小。
上面的代码是创建这种临时地图的最简单代码,而干净的解决方案将避免流操作本身之外的可变状态并在完成时返回一个新地图。但干净的解决方案并不总是最简洁的:
Map<Integer,String> map=Pattern.compile(",").splitAsStream(sContent)
.collect(HashMap::new, (m,s)->m.put(m.size(), s),
(m1,m2)->{ int off=m1.size(); m2.forEach((k,v)->m1.put(k+off, v)); }
);
虽然collect 的前两个参数定义了一个类似于前一个解决方案的操作,但最大的障碍是第三个参数,该函数仅在请求并行处理时使用,尽管单个 csv 行不太可能从并行处理中受益.但不支持省略它。如果使用,它将合并两个映射,这是两个并行操作的结果。由于两者都使用自己的计数器,因此必须通过添加第一个映射的大小来调整第二个映射的索引。