Similar to my previous question here, the User objects I have are these
new User("ayush","admin",23)
new User("ashish","guest",19)
new User("ashish","admin",20)
new User("garima","guest",29)
new User("garima","super",45)
new User("garima","guest",19)
Now I am trying to get the name to varying ages trend for these users. But I need to filter them above a threshold
age. I could get the trend using
Map<String, List<Integer>> userNameAndAgeTrend = users.stream().collect(Collectors.groupingBy(user-> user.getName(), Collectors.mapping(u-> u.getAge(), toList())));
this gives me {ashish=[19, 20], garima=[29, 45, 19], ayush=[23]}
. But I am unable to filter the List properly using threshold for example 21 years in my situation using such grouping. Can someone please help?
Also, using .filter(user -> user.getAge() > 21)
gives no mapping for ashish, which is what I want to store too. I can use Java10 installed on my machine and trying the suggested solutions.
You need to add the
.filter()
operation before the.collect()
oneStream.filter
You could use
filter
asAs confirmed by you in comments, this would give you as output
Collectors.filtering
If you're looking for all the names, you could also use
Collectors.filtering
since java-9 which explicitly calls out a similar behavior (formatting mine) :Its usage should look something like:
and the output now would be
if you want to
filter
before grouping:filter
is an intermediate operation which enables one to "keep the elements that satisfy the provided predicate" and exclude others that don't.So, after the
filter
operation you have a new stream consisting of only the elements that pass the provided predicate. in this case only users where their age is older than 21.if you want to
filter
after grouping (not to be confused withfilter
in a stream, this is a little different)the
filtering
collector as of JDK9:see, the accepted answer here for a JDK8 implementation.
With stream’s
filter
above, the values are filtered first and then it’s grouped. in other words, after filtering we have "no trace" of them.However, with the
filtering
collector as ofJDK9
we can maintain a trace.