Java 8 - How to use predicate that has a function with parameter?

梦想的初衷 提交于 2019-11-29 09:50:40

You cannot do exactly what you want - explicit parameters are not allowed in method references.

But you could...

...create a method that returns a boolean and harcoded the call to getAttribute("style"):

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

This would allow you to use the method ref:

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

...or you could define a variable to hold the function:

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

This would allow you to simply pass the variable

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

...or you could curry and combine the above two approaches (this is certainly horribly overkill)

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

Then you would need to call toAttributeExtractor to get a Function and pass that into the map:

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

Although, realistically, simply using a lambda would be easier (as you do on the next line):

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

You can't pass a parameter to a method reference. You can use a lambda expression instead :

int a = (int) blogImagesList.stream()
                            .map(w -> w.getAttribute("style"))
                            .filter(s -> s.contains(imageSrc))
                            .count();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!