java - 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
。唯一的问题是调用方式不同?
解决方案
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
,noneMatch
等allMatch
。
的用例Function<T, R>
是当您需要一个函数,该函数使用一个类型的参数T
并将其转换为一种类型R
,例如可能在调用stream.map(func)
.
您的代码片段的解释:
关于您帖子中的示例片段,Predicate<String>
它们Function<String, Boolean>
代表的内容是相同的,即它们都代表一个接受 aString
并返回 a的函数boolean
。但是,前者避免了将返回的值从boolean
to装箱,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);
推荐阅读
- python - Cloud Firestore 中的查询和请求
- javascript - 删除由函数创建的所有内容
- linux - 无法从 docker 的容器内连接到 postgres 容器
- reactjs - 如何在 React 中循环浏览我的搜索结果?
- amazon-web-services - AWS Api Gateway 与 dynamo 的集成
- node.js - 将对象转换为文档并返回的最佳方法?
- typescript - 函数具有显式返回时的窄推断类型
- swt - 如何在 SWT 中更新 PageBook 控件
- ruby-on-rails - Ruby/Rails:实现考虑活动记录的 to_csv 的正确方法
- javascript - 如何限制 HTML 中文本区域的字数