Java Stream-向后引用前一类

时间:2019-02-22 14:07:04

标签: java java-stream

我有两节课:

@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,但我做不到。

有什么想法吗?

1 个答案:

答案 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