我有两个类Foo
和Bar
,其中Foo
在其属性中有一个Bar
的列表,如下所示:
public class Bar {
int id;
...
public boolean isGood() {...}
}
public class Foo {
int id;
List<Bar> bars;
...
public boolean hasBadBar() {
boolean hasOnlyGoodBars = bars.stream().allMatch(Bar::isGood);
return !hasOnlyGoodBars;
}
}
现在,假设我有一个名为foos
的Foo
列表,并希望遍历foos
并报告包含错误Bar
的Foo
(bar.isGood()
为false)。我想报告(字符串版本的Foo id
,字符串版本的Bar id
)这样的事件。有什么想法如何做符合stream()
?
我可以单独报告id
的这样的Foos(或这样的酒吧),但我不知道如何做一对。
5条答案
按热度按时间62lalag41#
这应该可以达到目的:
其中
Pair
是某个编辑:要获得保存他们的
id
的List<Pair<String,String>>
,new Pair<>(String.valueOf(foo.id), String.valueOf(bar.id))
id
对的列表,请将现有的List<Pair<Foo,Bar>> pairs
转换为:zbdgwd5y2#
由于需要返回列表的列表,因此可能需要使用flatMap来收集所有内容
ghhaqwfi3#
假设1)你只关心第一个坏条,2)你在Foo中添加了一个可选的firstBadBar()方法,这段代码可以把id收集到一个map中:
jdg4fx2g4#
如果不需要收集,则应执行以下操作:
ljsrvy3e5#
您可以创建
Map<Foo, List<Bar>>
(将Foo
Map到包含与Foo
关联的所有坏Bar
的List<Bar>
)。首先,您有一个
List<Foo> foos
。然后,您可以使用
stream()
:filter
方法仅用于保留具有坏的Bar
的Foo
对象,然后使用map
方法为每个Foo
对象创建Pair<Foo, List<Bar>>
对象,以原始Foo
对象为键,以坏的Bar
的列表为值。collect
方法用于将流的元素收集到Map
中。然后,您可以使用
Map
打印Foo
和所有对应的坏Bar