在 Java 中使用 stream().collect 创建由 2 个列表组成的地图
Creating Map composed of 2 Lists using stream().collect in Java
例如,有两个列表:
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));
这对我有用,但 O(n^2):
Map<Double, String> collect =
list1.stream()
.collect(
toMap(Double::doubleValue,
item -> list2.get(list1.indexOf(item))));
您可以让 IntStream
.
生成索引,而不是使用辅助列表来保存索引
Map<Double, String> map = IntStream.range(0, list1.size())
.boxed()
.collect(Collectors.toMap(i -> list1.get(i), i -> list2.get(i)));
确实,最好的方法是使用 IntStream.range(startInclusive, endExclusive)
in order to access to each element of both lists with get(index)
and finally use Math.min(a, b)
来避免在列表大小不完全相同的情况下得到 IndexOutOfBoundsException
,因此最终代码将是:
Map<Double, String> map2 = IntStream.range(0, Math.min(list1.size(), list2.size()))
.boxed()
.collect(Collectors.toMap(list1::get, list2::get));
例如,有两个列表:
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));
这对我有用,但 O(n^2):
Map<Double, String> collect =
list1.stream()
.collect(
toMap(Double::doubleValue,
item -> list2.get(list1.indexOf(item))));
您可以让 IntStream
.
Map<Double, String> map = IntStream.range(0, list1.size())
.boxed()
.collect(Collectors.toMap(i -> list1.get(i), i -> list2.get(i)));
确实,最好的方法是使用 IntStream.range(startInclusive, endExclusive)
in order to access to each element of both lists with get(index)
and finally use Math.min(a, b)
来避免在列表大小不完全相同的情况下得到 IndexOutOfBoundsException
,因此最终代码将是:
Map<Double, String> map2 = IntStream.range(0, Math.min(list1.size(), list2.size()))
.boxed()
.collect(Collectors.toMap(list1::get, list2::get));