map operation which returns the input for the output after performing an action on the object.Consider an example where we have a
List<String> that we wish to map/reduce and perform an action on the reduction, but we also want a count of the entities we encounter.List<String> strings = Arrays.<String>asList(
"k-1", "k-2", "k-3", "x-4", "x-5", "x-6", "k-7");
long p = strings.stream()
.filter(n -> n.startsWith("k-")) // Filter starting with 'k-'
.map(n -> n.substring(2)) // Map to number in string.
.filter(NumberUtils::isDigits) // Include integers only.
.map(n -> Integer.parseInt(n)) // Map to int
.map(n -> {
System.out.println(n); // Perform action.
return n; // Return input as output.
})
.count(); // Terminate stream.
System.out.format(
"There were %d items of %d processed.\n",
p, strings.size());Above in steps 1 - 4 we perform a series of map/reduce operations to retrieve the integer portion of the string
"k-{n}". In steps 5-6 here we would normally use a forEach terminal operation we instead use a map intermediate operation which allows us to perform an action, returning the input so the stream stays open. In step 7 we finally invoke the terminal operation count which terminates the stream.Note: in the above I have multiple
filter/map operations that could be combined into single operations, that is perfectly fine; I recommend separating the tasks as it helps express your intention which can make it more readable.
No comments:
Post a Comment