前言

接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Lambda 表达式和函数式接口说明。

Lambda 表达式

lambda 表达式其实就是使用了新的语法结构来实现一个接口,并实现里面的唯一的一个方法,用来代替以前的使用匿名内部类的方式。

// x 指参数列表 -> 后面表示处理过程,Consumer 没有返回值
Consumer out = x -> System.out.println(x); // x,y 指参数列表 -> 后面表示处理过程和返回值
BinaryOperator<Integer> binaryOperator = (x,y) -> {return x > y ? 1 : -1 ;};

函数式接口

根据上面来看,其实就是实现了接口中的一个方法,所以这种接口有一个限制,只能有一个方法,像这样的接口就叫函数式接口,你也可以当成正常的接口来使用。

Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String o) {
System.out.println(o);
}
};

常用的函数式接口

我们基本不需要定义自己的函数式接口,Java8 已经给我们提供了大量的默认函数式接口,基本够用,在 rt.jar 包的 java.util.function 目录下可以看到所有默认的函数式接口,大致分为几类

  • Function<T,R> T 作为输入,返回的 R 作为输出
  • Predicate<T> T 作为输入 ,返回 boolean 值的输出
  • Consumer<T> T 作为输入 ,没有输出
  • Supplier<R> 没有输入 , R 作为输出
  • BinaryOperator<T> 两个 T 作为输入 ,T 同样是输出
  • UnaryOperator<T>Function 的变种 ,输入输出者是 T

其它的都是上面几种的各种扩展,只为更方便的使用,下面演示示例,你可以把其当成正常的接口使用,由用户使用 Lambda 来实现。

// hello world 示例
Function<String,String> function = (x) -> {return x+"Function";};
System.out.println(function.apply("hello world")); // hello world Function UnaryOperator<String> unaryOperator = x -> x + 2;
System.out.println(unaryOperator.apply("9420-")); // 9420-2 // 判断输入值是否为偶数示例
Predicate<Integer> predicate = (x) ->{return x % 2 == 0 ;};
System.out.println(predicate.test(1)); // false // 这个没有返回值
Consumer<String> consumer = (x) -> {System.out.println(x);};
consumer.accept("hello world "); // hello world // 这个没有输入
Supplier<String> supplier = () -> {return "Supplier";};
System.out.println(supplier.get()); // Supplier // 找出大数
BinaryOperator<Integer> bina = (x, y) ->{return x > y ? x : y;};
bina.apply(1,2); // 2

方法引用

Supplier<DateTimeConvert> supplier = () -> new DateTimeConvert();
DateTimeConvert dateTimeConvert = supplier.get();
Consumer<DateTimeConvert> consumer1 = (x) -> x.toCalendar();
consumer1.accept(dateTimeConvert);

可能 java 的开发者觉得上面的操作还是太复杂了,又创建了一个语法 :: 来表示 Lambda 表达式

Supplier<DateTimeConvert> supplier2 = DateTimeConvert::new;
Consumer<DateTimeConvert> consumer2 = DateTimeConvert::toCalendar;

一点小推广

创作不易,希望可以支持下我的开源软件,及我的小工具,欢迎来 gitee 点星,fork ,提 bug 。

Excel 通用导入导出,支持 Excel 公式

博客地址:https://blog.csdn.net/sanri1993/article/details/100601578

gitee:https://gitee.com/sanri/sanri-excel-poi

使用模板代码 ,从数据库生成代码 ,及一些项目中经常可以用到的小工具

博客地址:https://blog.csdn.net/sanri1993/article/details/98664034

gitee:https://gitee.com/sanri/sanri-tools-maven

最新文章

  1. [原]Redis主从复制各种环境下测试
  2. Html/Css(新手入门第二篇)
  3. C++学习40 抛出自己的异常
  4. 设计模式-代理模式(Proxy)
  5. POJ 3253 Fence Repair (贪心)
  6. de4dot 脱壳工具
  7. 微信支付生成带logo的二维码
  8. 201521123019《Java程序设计》第1周学习总结
  9. Material Design之CoordinatorLayout+AppBarLayout实现上滑隐藏ToolBar
  10. BZOJ 3164: [Heoi2013]Eden的博弈问题
  11. spark读取hbase形成RDD,存入hive或者spark_sql分析
  12. suricata 关键字补充说明
  13. VS IDE 中Visual C++ 中的项目属性配置
  14. SQL----&gt;mySQl数据库1------数据库的增删改查备份恢复
  15. Codeforces 526.D Om Nom and Necklace
  16. 日志一直打印 DEBUG o.s.amqp.rabbit.listener.BlockingQueueConsumer
  17. Pipeline组测试说明
  18. IOS NSURLConnection(大文件下载)
  19. 理解C#系列 / 前言
  20. ValueError: option names {&#39;--alluredir&#39;} already added 报错

热门文章

  1. python通过连接池连接redis,操作redis队列
  2. Oracle使用命令行登录提示ERROR: ORA-01017: invalid username/password; logon denied
  3. linux date 设置系统时间
  4. 操作Excel模块openpyxl
  5. React 受控组件和非受控组件
  6. C语言之整除
  7. 201871010109-胡欢欢《面向对象程序设计(java)》第十周学习总结
  8. pipenv安装包时一直卡在Locking [packages] dependencies…,换pypi源
  9. day23_7.29 多态和类的内置方法
  10. 安装_升级Eclipse插件