测验:流的映射

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

List numbers = Arrays.asList(1, 2, 3, 4, 5);
List 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。这正是flatMap所做的:

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

来源:java8实战

你可能感兴趣的:(测验:流的映射)