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?
So far I have
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.
I saw the accepted answer from @kocko which is both a good answer and totally correct. However there is a slightly alternative approach where you simply chain the filters.
This is basically doing the same thing but the
&&
operand is removed in favour of another filter. Chaining works really well for the Java 8 Stream API:s and IMO it is easier to read and follow the code.You can do:
This will fetch all the
MyObject
objects whichtype
member.List<String>
that meet some other criteria, represented with<predicate>