java8 Lambda 表达式和函数式接口快速理解
程序员文章站
2022-05-29 10:34:07
前言 接上篇文章 "java8 新特性" 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Lambda 表达式和函数式接口说明。 Lambda 表达式 lambda 表达式其实就是使用了新的语法结构来实现一个接口,并实现里面的唯一的一个方法,用来代替以前的使用匿名内部类的方式。 函 ......
前言
接上篇文章 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 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 公式
博客地址:
gitee:
使用模板代码 ,从数据库生成代码 ,及一些项目中经常可以用到的小工具
博客地址:
gitee:
上一篇: 时间、日期
下一篇: Linux系统进程管理
推荐阅读
-
函数式接口 + Lamda表达式推导过程(Java8 新特性)
-
java8 Lambda 表达式和函数式接口快速理解
-
深入理解lambda表达式与@FunctionalInterface函数式接口(一)
-
深入理解 lambda表达式 与 函数式编程 函数式接口源码解析(二)
-
荐 Java语言基础之JDK1.8新特性(Lambda表达式、函数式接口、Stream流、新的日期API)
-
java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念
-
荐 【Java】lambda表达式与函数式接口的完美配合
-
Lambda表达式详解(java8新特性,函数式编程)
-
如何优雅的将文件转换为字符串(环绕执行模式&行为参数化&函数式接口|Lambda表达式)
-
[Java笔记]动态代理、lambda表达式、函数式接口、构造器引用