如何使用java Lambda创建/初始化ArrayList的ArrayList

use*_*660 2 java lambda java-8

如何将以下代码转换为java8中的lambda ???

    List<List<String>> my2dList = new ArrayList<List<String>>();
    int counter = 0;
    for (int i = 0; i < 5; i++) {
        my2dList.add(new ArrayList<String>());
        for (int j = 0; j < 10; j++) {
            System.out.println("Counter: " +counter);
            my2dList.get(i).add(new String(""+counter));
            counter++;
        }
    }
Run Code Online (Sandbox Code Playgroud)

预期结果:

[[0,1,2,3,4,5,6,7,8,9],[10,11,12,13,14,15,16,17,18,19],[20,21, 22,23,24,25,26,27,28,29],[30,31,32,33,34,35,36,37,38,39],[40,41,42,43,44, 45,46,47,48,49]]

And*_*eas 5

您可以使用IntStream.range(int startInclusive, int endExclusive)生成整数流.

然后,您可以使用它mapToObj(IntFunction<? extends U> mapper)来处理这些整数.

最后,您可以使用collect(Collector<? super T,A,R> collector)收集值,例如List使用Collectors.toList().

List<List<String>> my2dList =
        IntStream.range(0, 5)
                 .mapToObj(i -> IntStream.range(0, 10)
                                         .mapToObj(j -> Integer.toString(i * 10 + j))
                                         .collect(Collectors.toList()))
                 .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

UPDATE

如果要在流式传输时打印值,请使用peek(Consumer<? super T> action).

如果peek()方法应该将值视为a int,则可以将表达式拆分为,mapToObj以便在转换为中间值之前查看中间值String.

String然后可以使用方法引用而不是lambda来完成转换.

                 .mapToObj(i -> IntStream.range(0, 10)
                                         .map(j -> i * 10 + j)
                                         .peek(val -> System.out.println("Counter: " + val))
                                         .mapToObj(Integer::toString)
                                         .collect(Collectors.toList()))
Run Code Online (Sandbox Code Playgroud)