Issue
I have a an object which looks like the following
class MyObject {
String type;
List<String> subTypes;
}
Is it possible, given a list of MyObject's to use Java 8 streams to filter on both the type and then the subtype?
myObjects.stream()
.filter(t -> t.getType().equals(someotherType)
.collect(Collections.toList());
but within this I also want another filter on each of the subTypes filtering those on a particular subtype too. I can't figure out how to do this.
An example would be
myObject { type: A, subTypes [ { X, Y, Z } ] }
myObject { type: B, subTypes [ { W, X, Y } ] }
myObject { type: B, subTypes [ { W, X, Z } ] }
myObject { type: C, subTypes [ { W, X, Z } ] }
I would pass in matchType B and subType Z, so I would expect one result -> myObject type B, subtypes: W, X, Z
the following currently returns 2 items in a list.
myObjects.stream()
.filter(t -> t.getType().equals("B")
.collect(Collectors.toList());
but I would like to add an additional filter over the each of the subtypes and only matching where 'Z' is present.
Solution
You can do:
myObjects.stream()
.filter(t -> t.getType().equals(someotherType) &&
t.getSubTypes().stream().anyMatch(<predicate>))
.collect(Collectors.toList());
This will fetch all the MyObject
objects which
- meet a criteria regarding the
type
member. - contain objects in the nested
List<String>
that meet some other criteria, represented with<predicate>
Answered By - Konstantin Yovkov
Answer Checked By - Mildred Charles (JavaFixing Admin)