我有一个看起来如下的对象
class MyObject {
String type;
List<String> subTypes;
}
Run Code Online (Sandbox Code Playgroud)
是否有可能,给定MyObject的列表,使用Java 8流来过滤类型和子类型?
到目前为止我有
myObjects.stream()
.filter(t -> t.getType().equals(someotherType)
.collect(Collections.toList());
Run Code Online (Sandbox Code Playgroud)
但在此范围内,我还希望对每个子类型上的另一个过滤器过滤特定子类型上的过滤器.我无法弄清楚如何做到这一点.
一个例子是
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 } ] }
Run Code Online (Sandbox Code Playgroud)
我会传入matchType B和subType Z,所以我希望得到一个结果 - > myObject type B,subtypes:W,X,Z
以下内容当前返回列表中的2个项目.
myObjects.stream()
.filter(t -> t.getType().equals("B")
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是我想在每个子类型上添加一个额外的过滤器,并且只匹配"Z"存在的位置.
Kon*_*kov 14
你可以做:
myObjects.stream()
.filter(t -> t.getType().equals(someotherType) &&
t.getSubTypes().stream().anyMatch(<predicate>))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这将获取所有MyObject对象
type会员的标准.List<String>中符合其他条件的对象,用.表示<predicate>was*_*ren 11
我看到@kocko接受的答案,这既是一个很好的答案也是完全正确的.但是,您可以轻松地将过滤器链接起来.
final List<MyObject> withBZ = myObjects.stream()
.filter(myObj -> myObj.getType().equals("B"))
.filter(myObj -> myObj.getSubTypes().stream().anyMatch("Z"::equals))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这基本上是做同样的事情,但&&操作数被删除,有利于另一个过滤器.链接适用于Java 8 Stream API:s和IMO,它更易于阅读和遵循代码.
| 归档时间: |
|
| 查看次数: |
17443 次 |
| 最近记录: |