Reputation: 83
How to convert the following code to lambda in java8???
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]]
Upvotes: 2
Views: 2022
Reputation: 159106
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()
.
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.
.mapToObj(i -> IntStream.range(0, 10)
.map(j -> i * 10 + j)
.peek(val -> System.out.println("Counter: " + val))
.mapToObj(Integer::toString)
.collect(Collectors.toList()))
Upvotes: 5