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类浅析的更多相关文章

  1. java8 Lambda表达式的新手上车指南(1)

    背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...

  2. 【Java学习笔记之三十一】详解Java8 lambda表达式

    Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...

  3. java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口

    背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...

  4. java8 快速入门 lambda表达式 Java8 lambda表达式10个示例

    本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...

  5. Java8 lambda表达式10个示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  6. Java8 Lambda表达式详解手册及实例

    先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...

  7. Java8 lambda表达式10个示例<转>

    例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...

  8. java8 lambda表达式应用

    1.用lambda表达式实现Runnable非常简单// Java 8之前: new Thread(new Runnable() { @Override public void run() { Sys ...

  9. Java8 Lambda表达式(一)

    目录 一.应用场景引入 优化一:使用策略模式 优化二:使用匿名内部类 优化三:使用Lambda表达式 优化四:使用Stream API 二.Lambda运算符和对应语法 语法格式 Lambda表达式需 ...

  10. Java8 Lambda表达式、函数式接口和方法引用

    目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...

随机推荐

  1. JDBC往数据库里插入数据

    首先还是一个工具类 插入数据

  2. HTML中的JavaScript

    HTML中的JavaScript 1.<script>元素 defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只对外部脚本文件有效. 脚本会被延迟到整个页面都解析完毕后再 ...

  3. 那些好用的 VS Code 插件,究竟是如何提高编码效率的?

    在上一篇文章中我们已经对 vscode 插件有了一个初步的认识与了解了,接下去我们就要"揭秘"一下市面上那些好用的 vscode 插件究竟是如何帮我们提高工作效率的. 本文首发于「 ...

  4. Nginx超详细常用功能演示,够用啦~~~

    前言 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服 ...

  5. C++ primer plus读书笔记——第6章 分支语句和逻辑运算符

    第6章 分支语句和逻辑运算符 1. 逻辑运算符的优先级比关系运算符的优先级低. 2. &&的优先级高于||. 3. cctype中的函数P179. 4. switch(integer- ...

  6. C++PRIMER第二章前半部分答案

    C++PRIMER第二章前半部分答案 哈哈哈,为什么是前半部分呢,后半部分还在学习中,重新系统性的学习c++,共同进步嘛,不多说,跟我一起来看看吧,第三章开始才是新手收割的时候,慢慢来~~ 2.1&a ...

  7. [刷题] PTA 7-61 找最长的字符串

    程序: 1 #include<stdio.h> 2 #include<string.h> 3 #define N 81 4 5 int main() { 6 char ch[N ...

  8. [刷题] 剑指Offer 面试题7:重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历结果,重建该二叉树.(假设输入的前序和中序遍历结果中都不含重复数字) 思路 构建二叉树的两个函数:Construct().ConstructCore() Cons ...

  9. Linux是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播。

    Linux是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播. Linux是众多操作系统之一 , 目前流行的服务器和 PC 端操作系统有 L ...

  10. 上,打开SSH服务的配置文件:/etc/ssh/sshd_config 加上如下两行: ClientAliveInterval 120 ClientAliveCountMax 720 第一行,表示每隔120秒向客户端

    SSH的默认过一段时间会超时,有时候正在执行着脚本,出去一会回来就断开了,输出信息都看不到了... 禁止SSH自动超时最简单的办法就是,每隔一段时间在客户端和服务器之间发送一个"空包&quo ...