Let
class Person { String name; int age; }
My variable is
Map<Sring, List<Person>> myVariable;
The result I’m aiming to get is
Map<String, List<Person>> result;
The condition is to collect all persons satisfying this condition
Predicate<Person> predicate = p -> p.age > 20;
If an entry in the map contains 3 persons and only 2 of them satisfies this condition, the 3rd one should be removed
Example: myVariable =
"1": [{name: "Foo", age: 15}, {name: "Foo", age: 13}, {name: "Foo", age: 14}] "2": [{name: "Foo", age: 15}, {name: "Foo", age: 13}, {name: "Foo", age: 14}] "3": [{name: "Foo", age: 15}, {name: "Foo", age: 13}, {name: "Foo", age: 14}] "4": [{name: "Foo", age: 15}, {name: "Foo", age: 21}, {name: "Foo", age: 27}]
result =
"4": {name: "Foo", age: 21}, {name: "Foo", age: 27}]
I tried this
Map<String, List<Persin>> result = myVariable.keySet().stream() .filter(p -> myVariable.keySet(p).stream().anyMatch(predicate)) .collect(Collectors.toMap(p -> p, myVariable.get(Function.identity()).stream().filter(predicate).collect(Collectors.toList())));
But it doesn’t work.
Advertisement
Answer
You can use two filter
calls:
Map<String, List<Person>> result = myVariable.entrySet().stream() .map(entry -> Map.entry(entry.getKey(), entry.getValue() .stream().filter(p -> p.getAge() > 20) .collect(Collectors.toList()))) .filter(entry -> !entry.getValue().isEmpty()) .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
If you’re on Java 8, replace Map.entry()
with new AbstractMap.SimpleEntry()
.