使用stream()创建由2个列表组成的地图。在Java中收集

时间:2016-10-10 16:33:28

标签: java-8 java-stream collectors

例如,有两个列表:

public class FileObject
{
     public string SomeMetaData {get; set;}
     public byte[] Content {get; set;}
}

使用Stream,我想创建一个由这些列表组成的地图,其中list1用于键,list2用于值。为此,我需要创建一个辅助列表:

List<Double> list1 = Arrays.asList(1.0, 2.0);
List<String> list2 = Arrays.asList("one_point_zero", "two_point_zero");

这是地图:

List<Integer> list0 = Arrays.asList(0, 1);

list0用于list1 :: get和list2 :: get的工作。没有创建list0有没有更简单的方法?我尝试了以下代码,但它不起作用:

Map<Double, String> map2 = list0.stream()
                .collect(Collectors.toMap(list1::get, list2::get));

3 个答案:

答案 0 :(得分:14)

您可以使用IntStream生成索引,而不是使用辅助列表来保存索引。

Map<Double, String> map = IntStream.range(0, list1.size())
            .boxed()
            .collect(Collectors.toMap(i -> list1.get(i), i -> list2.get(i)));

答案 1 :(得分:5)

确实,最好的方法是使用IntStream.range(startInclusive, endExclusive)来使用get(index)访问两个列表的每个元素,最后使用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));

答案 2 :(得分:4)

这对我有用,但是是O(n ^ 2):

    Map<Double, String> collect =
            list1.stream()
                    .collect(
                            toMap(Double::doubleValue, 
                                    item -> list2.get(list1.indexOf(item))));