我有两节课:
@Getter
@Setter
class Class
{
private Long id;
private String someValue;
private List<SubClass> subclasses;
}
@Getter
@Setter
class SubClass
{
private Long id;
private String someSearchValue;
}
我需要找到前Class
和前SubClass
,其中某些值与SubClass.someSearchValue
字段匹配。
这是做什么的
void someMethod(List<Class> classes){
SubClass foundSubClass = classes.stream()
.flatMap(c -> c.getSubclasses().stream())
.filter(sc -> "someValueToSearch".equals(sc.getSomeSearchValue()))
.findFirst().get();
Class someClass = classes.stream()
.filter(c -> c.getSubclasses().stream().anyMatch(sc -> "someValueToSearch".equals(sc.getSomeSearchValue())))
.findFirst().get();
}
如您所见,我必须使用filter
两次,使用相同的条件"someValueToSearch".equals(sc.getSomeSearchValue())
来找到两个对象。是否有可能仅使用filter
一次找到两个对象?我知道最简单的方法是在Class
中引用Subclass
,但我做不到。
有什么想法吗?
答案 0 :(得分:1)
好吧,我们可以断言foundSubClass
一定是孩子someClass
-第一个拥有someValueToSearch
的孩子-因此,通过颠倒someClass
的顺序肯定可以提高效率。流,并且仅在第二次搜索中查看Class someClass = classes.stream()
.filter(c -> c.getSubclasses().stream().anyMatch(Test::search))
.findFirst()
.get();
SubClass foundSubClass = someClass.getSubclasses().stream()
.filter(Test::search)
.findFirst()
.get();
//...
private static boolean search(SubClass subClass)
{
return "someValueToSearch".equals(subClass.getSomeSearchValue());
}
。
您也可以通过使用方法引用来进行整理,而不必两次定义相同的lambda。
\d