当前位置:  开发笔记 > 编程语言 > 正文

java 8可以将方法传递给过滤器

如何解决《java8可以将方法传递给过滤器》经验,为你挑选了1个好方法。

我有许多过滤器调用流对象的方法,并使用String方法,结果取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) )

Roland.. 5

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

一种可能的解决方案:

 Predicate compare(Function valueFunction, Predicate matchPredicate) {
  return p -> matchPredicate.test(valueFunction.apply(p));
}

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

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

P你的对象的类型在哪里.一个略微适应的变体,但可能导致许多重载方法:

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

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

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

这里没有真正的收获.只是另一种写作方式,你用更多的样板代码写的东西;-)

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



1> Roland..:

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

一种可能的解决方案:

 Predicate compare(Function valueFunction, Predicate matchPredicate) {
  return p -> matchPredicate.test(valueFunction.apply(p));
}

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

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

P你的对象的类型在哪里.一个略微适应的变体,但可能导致许多重载方法:

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

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

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

这里没有真正的收获.只是另一种写作方式,你用更多的样板代码写的东西;-)

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


几乎我的想法,除了我会使用`Predicate`和`BiPredicate`而不是布尔函数.
谓词肯定在这里看起来更好.感谢您的建议
推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有