多级列表过滤Java8

多级列表过滤Java8,java,java-8,java-stream,Java,Java 8,Java Stream,我正在与多层次的深度课程合作。我试图在内部深度进行过滤,但我收到了错误 Bad return type in lambda expression: Stream<InnerClassName> cannot be converted to boolean 这很好用。我试图实现的是使用类C中的值进行过滤,这些值可以通过Blist.getClist获得。如果您试图过滤列表的内容并获得与输出相同的格式,则可以执行以下操作: List<A> output = aList.st

我正在与多层次的深度课程合作。我试图在内部深度进行过滤,但我收到了错误

Bad return type in lambda expression: Stream<InnerClassName> cannot be converted to boolean 

这很好用。我试图实现的是使用
类C
中的值进行过滤,这些值可以通过
Blist.getClist

获得。如果您试图过滤
列表的内容
并获得与输出相同的格式,则可以执行以下操作:

List<A> output = aList.stream()
        .filter(a -> a.getBList().stream() // bList from a
                .flatMap(b -> b.getCList().stream()) // cList from each b
                .anyMatch(c -> c.getId() == 5)) // equals(5)
        .collect(Collectors.toList());
List output=aList.stream()
.filter(a->a.getBList().stream()//从
.flatMap(b->b.getCList().stream())//来自每个b的cList
.anyMatch(c->c.getId()==5))//等于(5)
.collect(Collectors.toList());

上述代码从
列表中过滤所有这些“A”,以便
列表的任何“B”部分中的
列表的任何“C”部分与给定条件匹配。

您的最终输出应该是什么<代码>列表
列表
?列表很好,我想检查是否存在带条件的链接对象,如果只有列表是可能的,这不会是一个问题。
c.getId().equals(5)
只有在
c.getId()
返回一个
整数时才能
true
。在这种情况下,最好使用
c.getId()==5
,这将得到相同的结果,但如果
c.getId()
不返回兼容的数字类型(而
Object.equals(Object)
接受任何内容,即使不可能是
true
),则会引发编译器错误。@Holger Point指出。谢谢这是8年前的,需要重新检查吗?不幸的是,这仍然有效。当
==
的两侧时=是对象,将进行参考比较。最好的解决方案是确保至少有一面不是对象。例如,如果任务不是关于匹配常量
5
,而是一个参数
整数匹配值
,则在流操作之前将其取消装箱,如
int-valueToUse=matchValue
,然后是流操作中的
anyMatch(c->c.getId()==valueToUse)
。@Holger为什么不在后一种情况下将对象与
相等进行比较?仅仅因为没有具体的类型限制在那里?这是一个原因。此外,类型提升行为不同,例如如何比较
int
long
,或者如何处理
null
(在右侧)。
AList.getBlist().stream().filter(bList -> bList.getId.equals(5));
List<A> output = aList.stream()
        .filter(a -> a.getBList().stream() // bList from a
                .flatMap(b -> b.getCList().stream()) // cList from each b
                .anyMatch(c -> c.getId() == 5)) // equals(5)
        .collect(Collectors.toList());