【发布时间】:2016-10-10 16:33:28
【问题描述】:
例如,有两个列表:
List<Double> list1 = Arrays.asList(1.0, 2.0);
List<String> list2 = Arrays.asList("one_point_zero", "two_point_zero");
使用 Stream,我想创建一个由这些列表组成的映射,其中 list1 用于键,list2 用于值。为此,我需要创建一个辅助列表:
List<Integer> list0 = Arrays.asList(0, 1);
这是地图:
Map<Double, String> map2 = list0.stream()
.collect(Collectors.toMap(list1::get, list2::get));
list0 按 list1::get 和 list2::get 的顺序使用。有没有更简单的方法而不创建list0?我尝试了以下代码,但没有成功:
Map<Double, String> map2 = IntStream
.iterate(0, e -> e + 1)
.limit(list1.size())
.collect(Collectors.toMap(list1::get, list2::get));
【问题讨论】:
-
答案找到了:我应该用 Stream.iterate(0, e -> e + 1) 而不是 IntStream.iterate(0, e -> e + 1)
-
这样您就可以关闭问题
-
不,不要使用
Stream.iterate(0, e -> e + 1).limit(list1.size())。使用IntStream.range(0, list1.size()).boxed()。与直接的range流相比,iterate和limit的组合具有明显的性能缺陷。将IntStream转换为Stream<Integer>就像链接boxed()一样简单。你甚至可以完全避免盒装Integers:IntStream.range(0, list1.size()).collect(HashMap::new, (m,i) -> m.put(list1.get(i),list2.get(i)), Map::putAll)
标签: java java-8 java-stream collectors