我有以下代码:
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的正确方法是什么?
Stream
当我尝试使用时map(),我遇到错误,因为getAttribute不是Function。
map()
getAttribute
Function
int a = (int) blogImagesList.stream() .map(WebElement::getAttribute("style")) .filter(s -> s.contains(imageSrc)) .count();
您无法完全执行所需的操作-方法引用中不允许使用显式参数。
但是你可以…
…创建一个方法,该方法返回一个布尔值并将其调用编码为getAttribute("style"):
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:
toAttributeExtractor
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();