Java 8流过滤列表中列表的值
我有一个对象,它看起来如下Java 8流过滤列表中列表的值,java,java-8,Java,Java 8,我有一个对象,它看起来如下 class MyObject { String type; List<String> subTypes; } 但在这里面,我还希望每个子类型上都有另一个过滤器,也过滤特定子类型上的过滤器。我不知道该怎么做 例如 myObject { type: A, subTypes [ { X, Y, Z } ] } myObject { type: B, subTypes [ { W, X, Y } ] } myObject { type: B,
class MyObject {
String type;
List<String> subTypes;
}
但在这里面,我还希望每个子类型上都有另一个过滤器,也过滤特定子类型上的过滤器。我不知道该怎么做
例如
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 } ] }
我会传入matchType B和子类型Z,所以我希望得到一个结果->myObject类型B,子类型:W,X,Z
以下内容当前返回列表中的2项
myObjects.stream()
.filter(t -> t.getType().equals("B")
.collect(Collectors.toList());
但是我想在每个子类型上添加一个额外的过滤器,并且只匹配存在“Z”的位置。您可以执行以下操作:
myObjects.stream()
.filter(t -> t.getType().equals(someotherType) &&
t.getSubTypes().stream().anyMatch(<predicate>))
.collect(Collectors.toList());
myObjects.stream()
.filter(t->t.getType().equals(someotherType)&&
t、 GetSubtype().stream().anyMatch())
.collect(Collectors.toList());
这将获取所有MyObject
对象
- 满足有关
类型的标准
- 在嵌套的
列表中包含满足某些其他条件的对象,用
- 我从@kocko那里看到了公认的答案,这是一个好答案,而且完全正确。但是,有一种稍微有点另类的方法,您可以简单地将过滤器链接起来
final List<MyObject> withBZ = myObjects.stream()
.filter(myObj -> myObj.getType().equals("B"))
.filter(myObj -> myObj.getSubTypes().stream().anyMatch("Z"::equals))
.collect(Collectors.toList());
bz=myObjects.stream()的最终列表
.filter(myObj->myObj.getType().equals(“B”))
.filter(myObj->myObj.getSubTypes().stream().anyMatch(“Z”::等于))
.collect(Collectors.toList());
这基本上是在做同样的事情,但是
&&
操作数被删除,取而代之的是另一个过滤器。链接对于Java 8 Stream API:s和IMO非常有效,它更易于阅读和遵循代码。您能给出一个匹配和未命中的示例吗?子类型
中的所有元素必须匹配吗?是否要筛选子类型
或什么?您所说的“每个子类型上的另一个筛选器筛选特定子类型上的元素”到底是什么意思?请举个例子,我同意最后一句话。感谢使用.stream().anyMatch(“Z”::equals)而不是just.contains(“Z”)?我不确定我是否遗漏了什么,或者它们是否真的是一样的
final List<MyObject> withBZ = myObjects.stream()
.filter(myObj -> myObj.getType().equals("B"))
.filter(myObj -> myObj.getSubTypes().stream().anyMatch("Z"::equals))
.collect(Collectors.toList());