How to create/Initialize ArrayList of ArrayList using java Lambda

Andrea

New Member
#1
How to convert the following code to lambda in java8???
Mã:
    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++;
        }
    }
expected result:
[[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]]
 

Admin

Administrator
Thành viên BQT
#2
You can use IntStream.range(int startInclusive, int endExclusive) to generate a stream of integers.

You can then use mapToObj(IntFunction<? extends U> mapper) to process those integers.

Finally, you can use collect(Collector<? super T,A,R> collector) to collect the values, e.g. to a List by using Collectors.toList().

Mã:
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());
UPDATE

If you want to print the values as they are streamed, use peek(Consumer<? super T> action).

If the peek() method should see the value as an int, you can split the expression in the mapToObj so you can peek at the intermediate value, before it is converted to String.

The conversion to String can then be done with a method reference, instead of a lambda.

Mã:
                 .mapToObj(i -> IntStream.range(0, 10)
                                         .map(j -> i * 10 + j)
                                         .peek(val -> System.out.println("Counter: " + val))
                                         .mapToObj(Integer::toString)
                                         .collect(Collectors.toList()))
 
Top