首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谓词值提取器

谓词值提取器
EN

Stack Overflow用户
提问于 2016-07-08 15:27:57
回答 2查看 544关注 0票数 3

在Java8中,Comparator类有这个真正精妙的静态方法,它通过使用Function的结果作为Comparator的输入,将Function组合成Comparator

我想要做的是,能够将Function对象与其他类型(如Predicate )组合在一起,以便使代码更加可读性,并使我的功能操作更加强大。

例如,假设有一个Set<Person>,其中Person有一个public String getName()方法。我希望能够过滤掉没有名称的Person对象。理想情况下,语法应该如下所示:

代码语言:javascript
复制
people.removeIf(Predicates.andThenTest(Person::getName, String::isEmpty));

是否有任何内置方法可以用类似于FunctionPredicate__组成一个__?我知道Function#andThen(Function),但这仅适用于将函数与其他函数组合在一起,遗憾的是,Predicate没有extend Function<T, Boolean>

我也知道我可以使用像p -> p.getName().isEmpty()这样的lambda,但是我想要一种用Function来组合预先存在的Predicate对象的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-11 15:54:26

Java 8中没有内置谓词的值提取器方法,但下一个最佳解决方案是自己实现它:

代码语言:javascript
复制
public class Predicates {
    public static <T,R> Predicate<T> andThenTest(
            Function<T,R> func, Predicate<R> pred) {
        return t -> pred.test(func.apply(t));
    }
}

由于@Holger,这也可能是:

代码语言:javascript
复制
return func.andThen(pred::test)::apply;
票数 0
EN

Stack Overflow用户

发布于 2016-07-11 14:33:02

您可以将Predicate转换为如下所示的Function

代码语言:javascript
复制
Predicate<String> p = String::isEmpty;
Function<String, Boolean> g = p::test; // predicate to function
Function<Boolean, String> f = Object::toString;
f.compose(g); // or g.andThen(f);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38270384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档