java 流比较列表与局部变量

java stream compare list with local variable

我有这样的代码来比较和获取 WebElement.. 但在最终形式中,方法看起来真的很糟糕。

WebElement g = x.get(0);
        //...
                for (WebElement webElement : x) {
                    if (webElement.getLocation().getY() < g.getLocation().getY()) {
                        g = webElement;
                    }
                }

当我尝试写这样的东西时:

g = x.stream().filter(y -> {y.getLocation().getY() < g.getLocation().getY()}).findFirst().get();

我的 editor/IDE 说他找不到 "g" 表达式。 如何使用流按某种条件搜索一个元素?

它不起作用,因为 g 必须有效地最终才能被 lambda 表达式访问。此外,传递给 filter.

的 lambda 表达式中的语法错误

你可以通过这种方式实现你想要的:

WebElement g = x.stream()
                .filter(y -> (y.getLocation().getY() < x.get(0).getLocation().getY()))
                .findFirst()
                .orElse (x.get(0));

访问 x 只要 x 是有效的最终值(这意味着它在初始化后没有分配新值)。

请注意,我为 findFirst 将 return 一个空的 Optional 添加了 orElse,因为在一个空的 [=17] 上调用 get() =] 抛出异常。

编辑:

我专注于修复您的 Java 8 代码,而没有足够注意您尝试转换的循环。我以为你想要 y 比第一个元素低的任何元素,但你想要整体最小值。我看到 mg_ 已经发布了正确答案。

Eran 指出了正确的方向 - 然而,误解了您试图找到的 任何 WebElement 其 getY() 值小于 x.get(0).getY() 但最小值的WebElement。

要实现这一点,Stream.min() 方法是您的朋友。

WebElement g = x.stream().min(Comparator.comparing(elem ->
        elem.getLocation().getY())).get();

应该按预期找到最小值。