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

标签 java lambda java-8 java-stream predicate

我有以下代码:

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();

最佳答案

您不能完全按照您的意愿行事 - 方法引用中不允许显式参数。

但是你可以...

...创建一个返回 boolean 值的方法并对 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();

...或者您可以柯里化(Currying)并结合上述两种方法(这肯定是太过分了)

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();

关于Java 8 - 如何使用具有参数函数的谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332428/

相关文章:

java - 如何在 Cloudera 中安排/触发 Spark 作业?

java - 为什么使用 Java 的流 API 收集器进行管道分组需要更多时间?

java - 使用 Java 8 流,如何将 Map<String, Map<String, List<Person>>> 转换为 Map<Integer, Map<String, Integer>>?

java - 为什么 Java8 flatmap 返回一个 List of List?

scala - 使用Java库的Scala,利用Java 8中的lambda表达式支持

java - 如何根据java 8中的匹配条件从2个不同的对象列表创建对象列表

java - 将数组中的元素移动到空位置

java - 为固定宽度的长句调整对话框消息 (JOptionPane) 的大小

java - 以编程方式查找摇晃或失焦的图像

c# - 根据秒数范围从 List<T> 创建子集 List<T>