1.Lambda表达式

1.1 Lambda表达式的标准格式

1 (形式参数) -> {代码块}

  形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可

  ->:由英文中画线和大于符号组成,固定写法。代表指向动作

  代码块:是我们具体要做的事情,也就是以前我们写的方法体内容

组成Lambda表达式的三要素:

  形式参数,箭头,代码块

1.2 Lambda表达式的省略模式

省略的规则

  参数类型可以省略。但是有多个参数的情况下,不能只省略一个

  如果参数有且仅有一个,那么小括号可以省略

  如果代码块的语句只有一条,可以省略大括号和分号,和return关键字

1.3 Lambda表达式的注意事项

使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法

必须有上下文环境,才能推导出Lambda对应的接口

  根据局部变量的赋值得知Lambda对应的接口

  Runnable r = () -> System.out.println("Lambda表达式");

  根据调用方法的参数得知Lambda对应的接口

  new Thread(() -> System.out.println("Lambda表达式")).start();

1.4 Lambda表达式和匿名内部类的区别

所需类型不同

  匿名内部类:可以是接口,也可以是抽象类,还可以是具体类

  Lambda表达式:只能是接口

使用限制不同

  如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类

  如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式

实现原理不同

  匿名内部类:编译之后,产生一个单独的.class字节码文件

  Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成

2.接口组成更新

2.1 接口组成更新概述

常量

  public static final

抽象方法

  public abstract

默认方法(Java 8)

静态方法(Java 8)

私有方法(Java 9)

2.2 接口中默认方法

格式

1 public default 返回值类型 方法名(参数列表) { }

注意事项

  默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字

  public可以省略,default不能省略

2.3 接口中静态方法

格式

1 public static 返回值类型 方法名(参数列表) { }

注意事项

  静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

  public可以省略,static不能省略

2.4 接口中私有方法

私有方法产生原因

Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性.

格式1

1 private 返回值类型 方法名(参数列表) { }

格式2

1 private static 返回值类型 方法名(参数列表) { }

注意事项

  默认方法可以调用私有的静态方法和非静态方法

  静态方法只能调用私有的静态方法

3.方法引用

3.1 方法引用符

方法引用符

  :: 符号为引用运算符,而它所在的表达式被称为方法引用

推导与省略

  如果使用Lambda,那么根据“可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式, 它们都将被自动推导

  如果使用方法引用,也是同样可以根据上下文进行推导

  方法引用是Lambda的孪生兄弟

3.2 引用类方法

引用类方法,其实就是引用类的静态方法

格式

1 类名::静态方法

接口

1 public interface Convert {
2 int convert(String s);
3 }

测试类

1 public class ConvertDemo {
2 public static void main(String[] args) {
3 useConvert(Integer::parseInt);
4 }
5
6 private static void useConvert(Convert c) {
7 System.out.println(c.convert("100"));
8 }
9 }

3.3 引用对象的实例方法

引用对象的实例方法,其实就引用类中的成员方法

格式

1 对象::成员方法

接口

1 public interface Printer {
2 void print(String s);
3 }

测试类

 1 public class Uppdemo {
2 public void toUpper(String s){
3 System.out.println(s.toUpperCase());
4 }
5 }
6
7 class Upper{
8 public static void main(String[] args) {
9 Uppdemo ud = new Uppdemo();
10
11 usePrint(ud::toUpper);
12
13 }
14
15 private static void usePrint(Printer p) {
16 p.print("hello world");
17 }
18 }

使用说明

  Lambda表达式被对象的实例方法替代的时候,它的形式参数全部传递给该方法作为参数

3.4 引用类的实例方法

引用类的实例方法,其实就是引用类中的成员方法

格式

1 类名::成员方法

测试类

 1 public interface MyStr {
2 String mySub(String s,int x,int y);
3 }
4
5 class MyStrDemo{
6 public static void main(String[] args) {
7 useMyStr(String::substring);
8 }
9
10 private static void useMyStr(MyStr ms) {
11 System.out.println(ms.mySub("hello world",2,5));
12 }
13 }

使用说明

  Lambda表达式被类的实例方法替代的时候 第一个参数作为调用者 后面的参数全部传递给该方法作为参数

3.5 引用构造器

引用构造器,其实就是引用构造方法

格式

1 类名::new

使用说明

  Lambda表达式被构造器替代的时候,它的形式参数全部传递给构造器作为参数

JavaSE22-Lambda表达式&方法引用的更多相关文章

  1. 函数式接口 & lambda表达式 & 方法引用

    拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...

  2. java8之lambda表达式&方法引用(一)

    本文将简单的介绍一下Lambda表达式和方法引用,这也是Java8的重要更新,Lambda表达式和方法引用最主要的功能是为流(专门负责迭代数据的集合)服务. 什么是lambda表达式 可以把lambd ...

  3. 黑马Lambda表达式学习 Stream流 函数式接口 Lambda表达式 方法引用

  4. 黑马方法引用学习 Stream流 函数式接口 Lambda表达式 方法引用

  5. 黑马函数式接口学习 Stream流 函数式接口 Lambda表达式 方法引用

  6. 黑马Stream流学习 Stream流 函数式接口 Lambda表达式 方法引用

  7. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  8. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  9. lambda与方法引用

    哈喽,大家好,我是指北君. 虽然目前Java最新版本都已经到16了,但是绝大部分公司目前用的Java版本都是8,想当初Java8问世后,其Lambda表达式与方法引用可是最亮眼的新特性,目前,这两个特 ...

  10. Java8特性之Lambda、方法引用以及Stream流

    Java 8 中的 Streams API 详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java笔记——Jav ...

随机推荐

  1. Windows SMBv3 CVE-2020-0796 漏洞分析和l漏洞复现

    0x00  漏洞描述 漏洞公告显示,SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码.攻击者利用该漏洞无须权限即可实现远 ...

  2. Docker学习第四天(Docker四种网络模式)

    Docker四种网络模式 实现原理 Docker使用Linux桥接(参考<Linux虚拟网络技术>),在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根 ...

  3. kali 系列学习03 - 主动扫描

    主动扫描首先考虑使用代理IP保护自己,其次掌握 Nmap 工具使用 第一部分 扫描对方时,最好隐藏一下自己root@kali:/etc# service tor statusUnit tor.serv ...

  4. 用Python写一个病毒

    WARNING 本文仅供学习和测试,请勿用于非法用途. 前言 花了挺长时间去开发的,中间有很多包是抄的,比如DDL注入.关于opencv等等,主要其实做了一些拼接.打包.部署. 写这篇博客并不真的想去 ...

  5. 装了IDM后看网页有时会自动弹出下载怎么办

    我们在安装了IDM之后,浏览一些网站时可能会自动弹文件下载窗口,但有时内容并非我们要下载的.对此类自动弹下载对话框的情况,操作者可进行自定义设置.不仅可通过设置文件格式来禁止自动弹窗,也可通过设置特定 ...

  6. 下载器Folx专业版有没有iTunes整合功能

    对于使用Mac系统的用户来说,相信对iTunes都不陌生.Folx专业版提供的iTunes整合功能,能将下载的音频.电影等文件自动同步到iTunes. 该功能将会有助于用户的音频.视频整合,对于喜欢听 ...

  7. 日常踩坑-------新手使用idea

    mybatis在idea的maven项目中的坑 今天遇到mybatis的报错,搞了好久才搞懂,在网上找了好久的相似案例,也没有搞定,先来看下网上常见的解决办法吧,相信也能解决大部分人的报错. 1.ma ...

  8. php数字运算与格式化

    浮点数高精度运算 PHP 官方手册 浮点数的精度有限.尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16.非基本数学运算可能会给出更大误 ...

  9. Java蓝桥杯——逻辑推理练习题

    逻辑推理题 谁是贼? 公安人员审问四名窃贼嫌疑犯.已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎.在回答公安人员的问题中: 甲说:"乙没有偷,是丁偷的.&quo ...

  10. 蓝桥杯——分组比赛(2017JavaB组第3题)

    分组比赛(17JavaB3) 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法: ABC DEF GHI ABC D ...