提高Java表达能力!不落伍一起掌握Java8中Lambda表达式、函数式接口及方法构造器数组引用
文章目录
- 函数式接口概述
- 函数式接口示例
- 内置函数式接口
- Lambda简述
- Lambda语法
- 方法引用
- 构造器引用
- 数组引用
函数式接口概述
只包含一个抽象方法的接口,称为函数式接口。
可以通过 Lambda 表达式来创建该接口的对象。
可以在一个接口上使用 @FunctionalInterface
注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。
在java.util.function包下定义了Java 8 的丰富的函数式接口。
在函数式编程语言当中,函数被当做一等公民对待。在将函数作为一等公民的编程语言中,Lambda表达式的类型是函数。但是在Java8中,有所不同。在Java8中,Lambda表达式是对象,而不是函数,它们必须依附于一类特别的对象类型——函数式接口。
简单的说,在Java8中,Lambda表达式就是一个函数式接口的实例。这就是Lambda表达式和函数式接口的关系。也就是说,只要一个对象是函数式接口的实例,那么该对象就可以用Lambda表达式来表示。所以用匿名实现类表示的现在都可以用Lambda表达式来写。
函数式接口示例
1、Runnable接口
2、自定义函数式接口
@FunctionalInterface
public interface MyFunctional01{public String getValue();
}//使用泛型
@FunctionalInterface
public interface MyFunctional02<T>{public T getValue(T t);
}
3、作为参数传递 Lambda 表达式
public class LambdaTest {public static void main(String[] args) {String newStr = toUpperString(str -> str.toUpperCase(),"abcDEf");System.out.println(newStr);}public static String toUpperString(MyFunc<String> my,String str){return my.getValue(str);}
}@FunctionalInterface
interface MyFunc<T>{public T getValue(T t);
}
内置函数式接口
import java.util.function.Consumer;/*** @Author: Yeman* @Date: 2021-10-03-22:50* @Description:*/
public class LambdaTest {public static void main(String[] args) {Consumer<Integer> consumer = i -> System.out.println(i);consumer.accept(9);}
}
Lambda简述
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
其本质是作为函数式接口(只有一个抽象方法)的实例。
Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操作符。这个操作符为 “->”
, 该操作符被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分:
①左侧:指定了 Lambda 表达式需要的参数列表。
②右侧:指定了 Lambda 体,是抽象方法的方法体。
Lambda语法
1、无参,无返回值
public class LambdaTest {public static void main(String[] args) {//未使用Lambda表达式Runnable runnable1 = new Runnable() {@Overridepublic void run() {System.out.println("这是第一个语法!");}};runnable1.run();System.out.println("======================");//使用Lambda表达式Runnable runnable2 = () -> {System.out.println("这是用了Lambda表达式的一个语法!");};runnable2.run();}
}
2、一个参数,无返回值
3、数据类型可以省略,因为可由编译器推断得出,称为“类型推断”
4、Lambda 若只需要一个参数时,参数的小括号可以省略
5、Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
6、当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略
方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。
方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致。
格式:使用操作符 “::
” 将类(或对象)与方法名分隔开。
如下三种主要使用情况:
①对象::非静态方法名
②类::静态方法名
③类::非静态方法名
示例:
import java.util.Comparator;
import java.util.function.Consumer;/*** @Author: Yeman* @Date: 2021-10-03-22:50* @Description:*/
public class LambdaTest {public static void main(String[] args) {Consumer<Integer> consumer = i -> System.out.println(i);consumer.accept(9);Consumer<String> stringConsumer = System.out :: println;stringConsumer.accept("Hello");Comparator<Integer> comparable = (x, y) -> Integer.compare(x,y);System.out.println(comparable.compare(2,9));Comparator<Integer> integerComparator = Integer :: compare;System.out.println(integerComparator.compare(9,2));}
}
构造器引用
格式:ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,要求构造器参数列表要与接口中抽象方法的参数列表一致,且方法的返回值即为构造器对应类的对象。
数组引用
可以将数组看作一个类,则数组引用就类似于构造器引用。
格式:type[] :: new
import java.util.function.Function;/*** @Author: Yeman* @Date: 2021-10-03-22:50* @Description:*/
public class LambdaTest {public static void main(String[] args) {Function<Integer,String[]> function = length -> new String[length];String[] apply = function.apply(3);System.out.println(apply[2]);System.out.println("================");Function<Integer,String[]> function1 = String[] :: new;System.out.println(function1.apply(5));}
}
提高Java表达能力!不落伍一起掌握Java8中Lambda表达式、函数式接口及方法构造器数组引用相关推荐
- java新特性-函数式接口-作为方法参数-作为方法的返回值-常用函数式接口-Supplier-Consumer-Predicate-Function
文章目录 函数式接口 概念 函数式接口作为方法参数 函数式接口作为方法的返回值 常用函数式接口 Supplier接口 常用函数式接口 Consumer 函数式接口之 Predicate接口 常用接口之 ...
- Java中Lambda表达式使用及详解
Java中Lambda表达式使用及详解 前言 一.Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中.使 ...
- 能力素质有所欠缺_孩子说话啰嗦没重点?家长学会“大脑整理术”,提高孩子表达能力...
文丨萱妈(文章原创 ,版权归本人所有,欢迎妈妈们转发分享) 引言 相信很多父母在孩子学说话的过程中,都会发现孩子的表达能力似乎有所欠缺,明明是一些很简单的问题,但到了孩子嘴里,就变成了复杂且难以理解的 ...
- 提高沟通表达能力该看什么书?有哪些沟通书籍值得推荐?
提高沟通表达能力该看什么书?有哪些沟通书籍值得推荐? 提高沟通表达能力的书籍,我只推荐你看这一本:<沟通与说服必读12篇>. 并且仅此一本就足够了. 之前我也看过很多沟通方面的书籍,并且几 ...
- 口才演讲范文:提高口头表达能力的技巧
在日常生活交往中,人们更多的是使用口头语言,所以,口头语言比书面语言起着更直接的.更广泛的交际作用.现代社会的发展,对人的口头表达能力提出了越来越高的要求.接下来大印文化与你分享如何掌握这些技巧,能进 ...
- Java中Lambda表达式和stream的使用
Java中Lambda表达式和stream的使用 转自 [*https://www.cnblogs.com/franson-2016/p/5593080.html*] 简介 (译者注:虽然看着很先进, ...
- Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)
Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...
- 【CSDN软件工程师能力认证学习精选】 Java8新特性学习-函数式编程(Stream/Function/Optional/Consumer)
CSDN软件工程师能力认证是由CSDN制定并推出的一个能力认证标准,宗旨是让一流的技术人才凭真才实学进大厂拿高薪,同时为企业节约大量招聘与培养成本,使命是提升高校大学生的技术能力,为行业提供人才储备, ...
- Java基础二十二:函数式接口介绍,函数式接口作为方法参数、返回值,Supplier接口、Consumer接口、Predicate接口、Function接口基本介绍及其案例小练习
函数式接口 1. 函数式接口概念及基本使用 1.函数式接口:有且仅有一个抽象方法的接口,函数式接口就是Lambda表达式使用的前提 2. Java中的函数式编程体现的就是Lambda表达式,所以函数式 ...
最新文章
- 揭开SAP Fiori编程模型规范里注解的神秘面纱 - @OData.publish工作原理解析
- idea的英文是什么意思_idealisation是什么意思中文翻译
- Windows环境下配置thrift编译器(VS2015)
- 第三章 寄存器(内存访问)
- python中的doctest_Python测试框架doctest
- 怎么理解Condition
- 【转】java线程池的原理和机制
- c语言设计题库及详解答案,c语言程序设计题库及其答案
- Pycharm安装中文语言插件
- 职中c语言课程,C语言课件下载【深圳职业技术学院】
- 超级计算机卫星云图,台风路径实时发布系统20号台风云图 台风艾莎尼高清卫星云图实时追踪...
- html修改字体大小到10像素,ps怎么修改字体大小
- 奥克兰计算机科学专业世界排名,新西兰计算机专业大学排名
- iOS 微信支付开发(最新版)
- 惠普硬盘测试工具_短DST未通过,详细教您惠普笔记本如何检测硬盘
- 时序因果分析算法(THP)学习与代码分析
- 考研英语 长难句训练day65
- oracle 导出身份证号_ORACLE对身份证号码处理相关的SQL汇总
- Excel ODBC导入器 驱动程序报错解决方式
- 问题解决zipimport.ZipImportError: can‘t decompress data; zlib not availabl
热门文章
- Google App Engine:在您自己的域中托管应用程序
- 如何取消高亮显示重复项_如何将重复数据突出显示?
- Windows 系统下通过命令将本地文件上传至远程 Linux 主机的指定目录下
- 美式英语中 [d] 的特别发音
- Linux 命令之 iwconfig 命令-配置无线网络接口
- 如何维护笔记本电脑的电池
- ioc spring 上机案例_通过实例解析Spring Ioc项目实现过程
- 在c语言中引用数组元素时,其数组下标的数据类型允许是什么
- C语言520心形表白,初学者福利!!
- Linux下CMAKE编译jsoncpp,使用CMake引入jsoncpp