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());