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.
Java stream provides a method filter() to filter stream elements on the basis of given predicate. Suppose you want to get only even elements of your list then you can do this easily with the help of filter method. This method takes predicate as an argument and returns a stream of consisting of resulted elements.
That means list. stream(). filter(i -> i >= 3); does not change original list. All stream operations are non-interfering (none of them modify the data source), as long as the parameters that you give to them are non-interfering too.
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
type
member.List<String>
that meet some other criteria, represented with <predicate>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With