美文网首页java8题库
测验:流的映射

测验:流的映射

作者: 草叶oo0 | 来源:发表于2019-08-26 19:45 被阅读0次

    (1)给定一个数字列表,如何返回一个由每个数的平方构成的列表呢?例如,给定[1, 2, 3, 4, 5],应该返回[1, 4, 9, 16, 25]。
    答案:你可以利用map方法的Lambda,接受一个数字,并返回该数字平方的Lambda来解决这个问题。

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> squares = numbers.stream()
                                    .map(n -> n * n)
                                    .collect(toList());
    

    (2)给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1, 2, 3]和列表[3, 4],应该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。为简单起见,你可以用有两个元素的数组来代表数对。
    答案:你可以使用两个map来迭代这两个列表,并生成数对。但这样会返回一个Stream<Stream<Integer[]>>。你需要让生成的流扁平化,以得到一个Stream<Integer[]>。这正是flatMap所做的:

    List<Integer> numbers1 = Arrays.asList(1, 2, 3);
    List<Integer> numbers2 = Arrays.asList(3, 4);
    List<int[]> pairs = numbers1.stream()
                                    .flatMap(i -> numbers2.stream()
                                                          .map(j -> new int[]{i, j})
                                    ).collect(toList());
    

    (3)如何扩展前一个例子,只返回总和能被3整除的数对呢?例如(2, 4)和(3, 3)是可以的。
    答案:你在前面看到了,filter可以配合谓词使用来筛选流中的元素。因为在flatMap操作后,你有了一个代表数对的int[]流,所以你只需要一个谓词来检查总和是否能被3整除就可以了:

    List<Integer> numbers1 = Arrays.asList(1, 2, 3);
    List<Integer> numbers2 = Arrays.asList(3, 4);
    List<int[]> pairs = numbers1.stream()
                                .flatMap(i -> numbers2.stream()
                                                       .filter(j -> (i + j) % 3 == 0)
                                                       .map(j -> new int[]{i, j})
                                ).collect(toList());
    

    来源:java8实战

    相关文章

      网友评论

        本文标题:测验:流的映射

        本文链接:https://www.haomeiwen.com/subject/ycadectx.html