首页 > 解决方案 > Java8中的谓词和函数接口有什么区别?

问题描述

我知道这可能是关于 SO 的一个非常基本的问题,但我想知道Java8 中的 aPredicate和Interface 有什么区别?Function

Predicate<String> predicateTest  = (s)-> s.length() > 5;       
System.out.println(predicateTest.test("Predicate"));

Function<String, Boolean> functionTest = str -> str.length()> 5;      
System.out.println(functionTest.apply("Function"));

在我的示例中,两者都返回true。唯一的问题是调用方式不同?

标签: javafunctionjava-8predicate

解决方案


Predicate<T>和之间的区别Function<T, R>

首先,aPredicate<T>严格的布尔值函数:

         _ _ _ _ _ _ _ 
        |             |
  T --> |  predicate  | --> boolean
        |_ _ _ _ _ _ _|   

而这对于 a 不一定是正确的Function<T, R>

         _ _ _ _ _ _ _ 
        |             |
  T --> |   function  | --> R
        |_ _ _ _ _ _ _| 

后者像Predicate<T>使能一样使用任何类型的对象,但返回类型可能会有所不同

Predicate<T>和的用例 Function<T, R>

的用例是当您需要一个使用一个类型参数并返回布尔值Predicate<T>的函数时。T例如,可能是在您想要过滤元素流的情况下,从满足条件的流中查找第一个元素.filter(predicate).findFirst(),或者检查满足特定条件的流中的元素是否存在anyMatch,noneMatchallMatch

的用例Function<T, R>是当您需要一个函数,该函数使用一个类型的参数T并将其转换为一种类型R,例如可能在调用stream.map(func).

您的代码片段的解释:

关于您帖子中的示例片段,Predicate<String>它们Function<String, Boolean> 代表的内容是相同的,即它们都代表一个接受 aString并返回 a的函数boolean。但是,前者避免了将返回的值从booleanto装箱,Boolean而后者则没有。

也就是说,这并不一定意味着您可以在任何地方使用 aPredicate<String>您也可以使用 a Function<String, Boolean>,反之亦然。

例子:

虽然编译:

Predicate<String> predicate = p -> p.length() == 21;
Stream<String> stream = stringList().stream().filter(predicate);

这不会:

Function<String, Boolean> function = p -> p.length() == 21;
Stream<String> stream = stringList().stream().filter(function);

反之亦然:

虽然这有效:

Function<String, Boolean> function = p -> p.length() == 21;
Stream<Boolean> stream = stringList().stream().map(function);

这不会:

Predicate<String> predicate = p -> p.length() == 21;
Stream<Boolean> stream = stringList().stream().map(predicate);

推荐阅读