java 8 你能将方法传递给过滤器吗

标签 java java-8 java-stream

我有很多过滤器调用流对象的方法并使用在结果上采用 1 个参数的字符串方法:

String s = "aComarisonString";

stream().filter( p -> p.thisReturnsAString().startsWith(s) )
stream().filter( p -> p.thisReturnsAString2().startsWith(s) )
stream().filter( p -> p.thisReturnsAString().endsWith(s) )
stream().filter( p -> p.thisReturnsAString().contains(s) )

有没有办法生成过滤器,使其看起来/工作起来像

.filter( compare(thisReturnsAString,contains(s) )
.filter( compare(thisReturnsAString2,endsWith(s) )

最佳答案

有几种方法,但我同意@shmosel。可读性几乎没有改善。

可能的解决方案之一:

<V, P> Predicate<? super P> compare(Function<P, V> valueFunction, Predicate<V> matchPredicate) {
  return p -> matchPredicate.test(valueFunction.apply(p));
}

对该方法的调用如下所示:

stream().filter(compare(P::thisReturnsAString, s -> s.endsWith(comparisonString)))

P 是对象的类型。一个稍微改编的变体,但是可能会导致大量重载方法:

<V, C, P> Predicate<? super P> compare(Function<P, V> valueFunction, BiPredicate<V, C> matchPredicate, C value) {
  return p -> matchPredicate.test(valueFunction.apply(p), value);
}

对该方法的调用可能如下所示:

stream().filter(compare(P::thisReturnsAString, String::endsWith, comparisonString))

这里没有真正的收获。只是另一种编写方式,您使用更多样板代码编写的内容 ;-)

编辑:添加了@shmosel 关于谓词与函数的建议

关于java 8 你能将方法传递给过滤器吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41674709/

相关文章:

java - 构建 Apache 时未定义对 XML_GetErrorCode(和其他)的引用

Java - TCP - 多线程服务器 - 如何处理多个客户端连接?

java - Java 8 列表中 2 个字符串的每个组合

java - 需要一种方法来获取与 List.stream().anyMatch() 匹配的字符串中的模式

java - 使用 JaXB 解码后获取 null?

java - Axis webservice 中的源 jar 从哪里加载?

java - 在 Tomcat 中运行不同 Java 版本的 Web 应用程序

java - 在 java 中收集 arraylist 的更快方法

java - 如何使用新的 computeIfAbsent 函数?

java - 从流中获取字符串列表