java流比较列表与局部变量

时间:2015-02-18 09:15:26

标签: java selenium lambda java-8 java-stream

我有这样的代码用于comapre并获取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();

我的编辑/ IDE说他找不到&#34; g&#34;表达。 如何使用流搜索某个元素?

2 个答案:

答案 0 :(得分:4)

Eran指出了正确的方向 - 然而,误解了你试图找不到任何<{1}}值小于getY() WebElement但其值为最小的WebElement

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

x.get(0).getY()

应该按预期找到最小值。

答案 1 :(得分:2)

它不起作用,因为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(这意味着它在初始化后未分配新值)。

请注意,我为orElse将返回空findFirst的情况添加了Optional,因为在空get()上调用Optional会引发异常。

编辑:

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