当前位置: 首页 > 面试题库 >

Java 8-如何使用具有参数的谓词?

程毅
2023-03-14
问题内容

我有以下代码:

public boolean isImageSrcExists(String imageSrc) {
    int resultsNum = 0;
    List<WebElement> blogImagesList = driver.findElements(blogImageLocator);

    for (WebElement thisImage : blogImagesList) {
        if (thisImage.getAttribute("style").contains(imageSrc)) {
            resultsNum++;
        }
    }

    if (resultsNum == 2) {
        return true;
    } else {
        return false;
    }
}

将其转换为使用Java 8 Stream的正确方法是什么?

当我尝试使用时map(),我遇到错误,因为getAttribute不是Function

int a = (int) blogImagesList.stream()
                            .map(WebElement::getAttribute("style"))
                            .filter(s -> s.contains(imageSrc))
                            .count();

问题答案:

您无法完全执行所需的操作-方法引用中不允许使用显式参数。

但是你可以…

…创建一个方法,该方法返回一个布尔值并将其调用编码为getAttribute("style")

public boolean getAttribute(final T t) {
    return t.getAttribute("style");
}

这将允许您使用方法ref:

int a = (int) blogImagesList.stream()
              .map(this::getAttribute)
              .filter(s -> s.contains(imageSrc))
              .count();

…或者您可以定义一个变量来保存该函数:

final Function<T, R> mapper = t -> t.getAttribute("style");

这将允许您简单地传递变量

int a = (int) blogImagesList.stream()
              .map(mapper)
              .filter(s -> s.contains(imageSrc))
              .count();

…或者您可以咖喱和结合上述两种方法(这绝对是过分的杀伤力)

public Function<T,R> toAttributeExtractor(String attrName) {
    return t -> t.getAttribute(attrName);
}

然后,您需要调用toAttributeExtractor获取一个Function并将其传递给map

final Function<T, R> mapper = toAttributeExtractor("style");
int a = (int) blogImagesList.stream()
              .map(mapper)
              .filter(s -> s.contains(imageSrc))
              .count();

尽管实际上,仅使用lambda会更容易(就像您在下一行中所做的那样):

int a = (int) blogImagesList.stream()
              .map(t -> t.getAttribute("style"))
              .filter(s -> s.contains(imageSrc))
              .count();


 类似资料:
  • 我试图创建一个从最终用户抽象谓词使用的类。 我的应用程序使用了番石榴重试扩展,效果很好。 我可以很容易地用谓词调用它,它会轮询,直到谓词返回false。 现在,也许我误解了谓词,但我正在尝试创建一个类来抽象它们。 我想这样称呼它 所以我写了如下PollCondition类。 但是MyPoller。poll()调用无法编译-未声明结果。 知道吗?

  • 问题内容: 我想知道带有方法引用和功能接口的所有这些东西如何在较低级别上工作。最简单的例子是我们有一些列表 现在我们要使用Collections类对其进行排序,因此我们可以调用: 但是,如果我们定义自定义比较器,则可能类似于: 问题在于Collections.sort具有两个参数:List和Comparator。由于Comparator是功能性接口,因此可以用具有相同签名(参数和返回类型)的lam

  • 问题内容: 我有一个清单,我想分成几个小清单。 说出所有包含“ aaa”的项目,所有包含“ bbb”的项目以及更多谓词。 我该如何使用java8? 我看到了这篇文章,但只拆分为2个列表。 我看到了这篇文章,但是在Java 8之前已经很老了。 问题答案: 就@RealSkeptic中解释的那样,注释只能返回两个结果:true和false。这意味着您将只能将数据分为两组。 您需要的是某种可以让您确定应

  • 我只想传递一个lambda(代码块),并在需要时执行它。如何在下面的代码中实现方法(以及方法签名是什么):

  • 有两个具有相同结构的地图,即map1和map2,其结构为

  • 我有一个类似这样的pytest测试: 现在,作为重构的一部分,我移动了这一行: 放入它自己的夹具中(在conftest.py文件中),因为它在其他地方使用。但是,除了直接导入fixture函数外,是否有其他方法在测试中引用它?我知道funcargs通常是调用fixture的方式,但是在本文中,当我想要调用fixture时,我不在测试函数中。