Java Lambda基础——Function, Consumer, Predicate, Supplier, 及FunctionalInterface接口
这几个接口经常与Lambda结合使用,网上当然也有很多介绍,不过有些过于繁琐,有些又偏简单,秉着实用主义精神,今天这里折中一下,把介绍的内容分为两部分,第一部分相当于TLDR,总结几个“口诀”,便于大家记忆,对于更想看用法示例的同学们,第二部分者提供了所有这些接口的示例。希望对大家有所帮助。
口诀
√如无参数,请使用Supplier(Use Supplier if it takes nothing)
√如无返回,请使用Consumer(Use Consumer if it returns nothing)
√如两者都无,请使用Runnable(Use Runnable if it does neither)
√如两者都有,请使用Function(Use Function if it does both)
√如返回布尔值,请使用Predicate(Use Predicate if it returns a boolean)
√如以上皆不可以,请使用自定义@FunctionalInteface(Use @FunctionalInteface if none of above works)
示例
- Supplier
private static <T> T testSupplier(Supplier<T> supplier) {
return supplier.get();
}
...
Integer s = testSupplier(() -> 7 + 3); // 不接受任何参数,但会返回数据
System.out.println(s); // 输出10
- Consumer
private static <T> void testConsumer(Consumer<T> consumer, T data) {
consumer.accept(data);
}
...
testConsumer(System.out::println, "dummy"); // 直接调用println,输出"dummy",无任何返回
- Runnable
private static void testRunnable(Runnable runnable) {
runnable.run();
}
...
testRunnable(() -> System.out.println("dummy")); // 既无输入,也无输出
- Function
private static <T, R> R testFunction(Function<T, R> function, T data) {
return function.apply(data);
}
...
Integer f = testFunction((d) -> d * 2, 3); // 既有输入,也有输出(将给定值X2)
System.out.println(f); // 输出6
- Predicate
private static <T> boolean testPredicate(Predicate<T> predicate, T data) {
return predicate.test(data);
}
...
boolean p = testPredicate((d) -> d > 0, 100); // 接受输入,输出布尔值(判断给定值是否为正数)
System.out.println(p); // 输出true
- @FunctionalInterface
@FunctionalInterface
public interface CalculationFuncInterface<T, U, R> {
public R apply(T l, U i);
}
...
private static <T, U, R> R testFunctionalInterface(CalculationFuncInterface<T, U, R> cal, T data1, U data2) {
return cal.apply(data1, data2);
}
...
Integer fi = testFunctionalInterface((a, b) -> a * b, 6, 7); // 接受两个输入参数,并返回其乘积
System.out.println(fi); // 输出42
今天的介绍就先到这,感谢大家,Cheers!
公众号“程序员杂书馆”,欢迎关注。免费送出O'Reilly《Spark快速大数据分析》纸质书(亦有一批PDF分享)!


Java Lambda基础——Function, Consumer, Predicate, Supplier, 及FunctionalInterface接口的更多相关文章
- java8 array、list操作 汇【2】)- (Function,Consumer,Predicate,Supplier)应用
static class UserT { String name; public UserT(String zm) { this.name=zm; } public String getName() ...
- Java8 (Function,Consumer,Predicate,Supplier)详解
1. https://blog.csdn.net/lzm18064126848/article/details/70199769 1.1 https://blog.csdn.net/turbo_zon ...
- Java—Lambda基础
虽然JVM有着Scala .Groovy .Clojure 等依赖于JVM的函数语式语言,但直到Java8才算是java正式支持函数式编程: Java8中加入了Lambda的支持标志着Java正式加入 ...
- 函数式接口的使用 (Function、Predicate、Supplier、Consumer)
参考:https://blog.csdn.net/jmj18756235518/article/details/81490966 函数式接口 定义:有且只有一个抽象方法的接口 Function< ...
- java代码之美(15)---Java8 Function、Consumer、Supplier
Java8 Function.Consumer.Supplier 有关JDK8新特性之前写了三篇博客: 1.java代码之美(1)---Java8 Lambda 2.java代码之美(2)---Jav ...
- java代码(15) ---java8 Function 、Consumer 、Supplier
Java8 Function.Consumer.Supplier 有关JDK8新特性之前还有三篇博客: 1,java代码(1)---Java8 Lambda 2,java代码(2)---Java8 S ...
- Java 8 基础教程 - Predicate
在Java 8中,Predicate是一个函数式接口,可以被应用于lambda表达式和方法引用.其抽象方法非常简单: /** * Evaluates this predicate on the giv ...
- 30 分钟 Java Lambda 入门教程
Lambda简介 Lambda作为函数式编程中的基础部分,在其他编程语言(例如:Scala)中早就广为使用,但在Java领域中发展较慢,直到java8,才开始支持Lambda. 抛开数学定义不看,直接 ...
- Java Lambda表达
Java 8 lambda表达式示例 我个人对Java 8发布非常激动,尤其是lambda表达式和流API.越来越多的了解它们,我能写出更干净的代码.虽然一开始并不是这样.第一次看到用lambda表达 ...
随机推荐
- Confluence 6 修改特定的空间标识图片
空间管理员可以为他们管理的空间修改空间标识图片.这个修改将会覆盖默认的空间标识图片,任何对默认空间图标表示的修改将不会对已经修改的空间标识图片产生影响.请查看上面的例子中的 'Sample Space ...
- 学习Spring Boot:(一)入门
微服务 现在微服务越来越火了,Spring Boot热度蹭蹭直升,自学下. 微服务其实是服务化思路的一种最佳实践方向,遵循SOA(面向服务的架构)的思路,各个企业在服务化治理上面的道路已经走得很远了, ...
- phpstudy添加redis扩展
操作系统 windows: 直接贴步骤记录下 一. 划重点,运行phpinfo(), 观察第四行 x86 好了记住这个 x86 三. http://pecl.php.net/pa ...
- linux文件权限目录配置笔记
###linux 文件权限目录配置笔记 ---------- 多人多任务环境 linux 一般将文件可存取的身份分为三个类别:owner group others Permission deny ls ...
- React基础知识备忘
section-1 //react组件 export class Halo extends React.Component{ constructor(...args){ super(...args); ...
- Python基础之继承与派生
一.什么是继承: 继承是一种创建新的类的方式,新建的类可以继承一个或过个父类,原始类成为基类或超类,新建的类则称为派生类 或子类. 其中,继承又分为:单继承和多继承. class parent_cla ...
- XSS-HTML&javaSkcript&CSS&jQuery&ajax-CSS
CSS 1.表单的处理 <style> table, td, th{ border:1px; solid green;} th{ background-color:green; color ...
- mybatis-查询过程
基本的查询过程: sqlsession--->executor---->statementhandler---->statement----->db InputStream r ...
- vue 中动态绑定class 和 style的方法
先列举一些例子 :class="['content',{'radioModel':checkType}]" :class="['siteAppListDirNode',{ ...
- Angularjs 学习笔记-2017-02-05-初识Angular及app、model、controller、repeat指令和fileter、orderBy
ng-app 定义作用域,从作用域处开始执行ng命令指令 ng-model 数据绑定字符,用于双向数据绑定 ng-controller ng控制台,定义function name($scope)来 ...