Java8 Lambda表达式、Optional类浅析
1.概念
Lambda是一个匿名函数,可以将其理解为一段可以传递的代码(将代码像数据一样进行传递)可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使得java语言的表达能利得到了提升。
2. Lambda表达式的基础语法
java8中引用了一个新的操作符"->",该操作符称为箭头操作符或者Lambda操作符,箭头操作符将Lambda表达式分为了两部分:
左边:Lambda表达式的参数列表
右边:Lambda表达式中,所需要执行的功能,即 Lambda体
语法格式一:无参数,无返回值的方法() -> Lambda体
如: () -> System.out.println("hello");
语法格式二:有一个参数,并且无返回值(参数1) -> Lambda体
如: (x) -> System.out.println("hehe");
语法格式三:若只有一个参数小括号可以省略不写参数1-> Lambda体
如: x -> System.out.println("hehe");
语法格式四:有两个以上的参数,有返回值,并且Lambda体中有多条语句(参数1,参数2) -> {语句体1;语句体2};
如:
Comparator com -> (x,y) -> {
System.out.println("函数式接口");
return Integer.compare(x,y);
}
语法格式五:若Lambda体中只有一条语句,return和大括号都可以不写(参数1,参数2) -> 语句体1;
如:Comparator com = (x,y) -> Integer.compare(x,y);
语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出数据类型即“类型推断”
如: (Integer x, Integer y) -> Integer.compare(x,y);
3. Lambda表达式需要“函数式接口”的支持
函数式接口:接口中只有一个抽象方法的借口,称为函数式接口,可以使用注解** @FunctionInterface **修饰,可以检查是否是函数式接口
4. java8中内置的四大核心函数式接口
Consumer<T> : 消费型接口
void accept(T t);
Supplier<T> : 供给型接口
T get();
Function<T, R> : 函数型接口
R apply(T t);
Predicate<T> : 断言型接口
boolean test(T t);
5. 方法引用
概念:若Lambda 体中的内容有方法已经实现了,我们可以使用“方法引用”(可以理解为“方法引用”是Lambda表达式的另外一种表现形式)
主要有三种语法格式:
- 对象::实例方法名
- 类::静态方法名
- 类::实例方法名
注意:
- Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值保持一致;
- 若 Lambda 参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName :: method (类::实例方法名)
6. 构造器引用
格式:ClassName::new
注意:
- 需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致
7. 数组引用
格式:Type[]::new;
Optional类
<1> 概念
Optional是一个容器类,代表一个值存在或不存在,原来用null表示值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常
<2> Optional容器类的常用方法
Optional.of(T t):创建一个Optional实例
Optional.empty():创建一个空的Optional实例
Optional.ofNullable(T t):若t不为null,创建一个Optional实例,否则创建空实例
注意:
of方法不能构建null,会报出空指针异常
empty只是构建一个空的Optional
ofNullable传入对象就构建对象,传入null就构建一个空的Optional
isPresent():判断是否包含值
orElse(T t):如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s):如果调用对象包含值,返回该值 否则返回s获取的值
map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
flatMap(Function mapper):与map类似,要求返回值必须是Optional
原文参见公众号【Java知音】
Java8 Lambda表达式、Optional类浅析的更多相关文章
- java8 Lambda表达式的新手上车指南(1)
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- 【Java学习笔记之三十一】详解Java8 lambda表达式
Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...
- java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- java8 快速入门 lambda表达式 Java8 lambda表达式10个示例
本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...
- Java8 lambda表达式10个示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...
- Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...
- Java8 lambda表达式10个示例<转>
例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...
- java8 lambda表达式应用
1.用lambda表达式实现Runnable非常简单// Java 8之前: new Thread(new Runnable() { @Override public void run() { Sys ...
- Java8 Lambda表达式(一)
目录 一.应用场景引入 优化一:使用策略模式 优化二:使用匿名内部类 优化三:使用Lambda表达式 优化四:使用Stream API 二.Lambda运算符和对应语法 语法格式 Lambda表达式需 ...
- Java8 Lambda表达式、函数式接口和方法引用
目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...
随机推荐
- XCTF-web_python_template_injection
web_python_template_injection 这里涉及到flask的ssti漏洞(服务端模板注入). 简单点说就是,在使用flask/jinja2的模板渲染函数render_templa ...
- 【c#】 使用Directory.GetFiles获取局域网中任意电脑指定文件夹下的文件
本文为老魏原创,如需转载请留言 格式如下: // 获取IP地址为10.172.10.167下D盘下railway下的所有文件 string[] picArray = Directory.GetFile ...
- Asp.NetCore Web开发之初始文件解析
在写代码之前,有必要了解一下.net帮我们生成的文件都是干什么用的,在开发过程中他们都负责那些地方(下面以MVC模板举例). 先简单介绍一下什么是MVC,MVC(model-view-controll ...
- CRM系统如何改善企业业务流程
工作流管理是CRM客户管理系统的一个重要功能.当企业进行业务管理和处理时,会有一套自己的工作流程.使用CRM系统,可以帮助企业改进整个工作流程,利用系统的流程设置模块,将各个部门所处理的活动定义为过程 ...
- Office·Word高级·VBA基础概念语法
阅文时长 | 5.21分钟 字数统计 | 1823字符 『Office·Word高级·VBA基础概念语法』 编写人 | SCscHero 编写时间 | Monday, June 29, 2020 文章 ...
- 神奇的不可见空格<200b>导致代码异常
故事是这样发生的,在做一个JSON对象转化的时候,出现了转化异常:刚开始还是以为是格式错误,后来一步步排除,才发现是不可见空格<200b>导致的解析异常 出现 使用Typora编写文字时, ...
- [bug] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full
原因 lib文件缺失 参考 https://blog.csdn.net/weixin_41060905/article/details/86911172
- 面向对象——python核心编程第二版
类与实例 类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象的具体信息. class MyData(object): pass >>& ...
- libvirtd 启动成功,但却没有监听
现象: 执行 systemctl start libvirtd在其它机器上进行测试是否监听:virsh -c qemu+tcp://host/system libvirtd启动成功,没有报错,但却没有 ...
- WIFF SD卡
https://detail.tmall.com/item.htm?spm=a230r.1.14.1.2d4d6923Fq3Hgx&id=36945441834&cm_id=14010 ...