有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带局部变量的selenium java流比较列表

我有这样的代码来编译和获取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说他找不到“g”的表达。 如何使用流按某种条件搜索一个元素


共 (2) 个答案

  1. # 1 楼答案

    Eran指出了正确的方向——但是,我不明白,您试图找到的不是任何getY()值小于x.get(0).getY()WebElement,而是最小值的WebElement

    为了实现这一点,Stream.min()方法是你的朋友

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

    应该找到预期的最小值

  2. # 2 楼答案

    它不起作用,因为g必须是有效的final,才能被lambda表达式访问。此外,在传递给filter的lambda表达式中,您还有错误的语法

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

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

    只要x是有效的final(这意味着初始化后没有为它分配新值),访问x就可以工作

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

    编辑:

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