1、 函数式接口

有且只有一个抽象方法的接口就是函数式接口。

函数式接口的定义格式:

Interface 接口名{

抽象方法;

}

@Override:用来修饰方法声明,告诉编译器该方法是重写父类的方法,如果父类没有该方法,则编译失败。

@FunctionalInterface 使用该注解来定义接口,

JDK 1.8新特性

用来修饰接口。告诉编译器该接口是一个函数式接口,如果接口不是函数式接口,就会编译失败。

Lambda表达式的特点:

延时执行。在需要的时候,再执行。

例子:记录日志、用户的访问日志、系统日志。

函数式接口使用场景:

(a)   如果方法参数是函数式接口的类型,则可以出传递Lambda表达式

(b)   如果方法返回值类型时函数式接口类型,则可以返回Lambda表达式

2、方法引用

通过类名或对象名引用已经存在的方法来简化Lambda表达式。通过一个方法名字来引用已经存在的方法,可以减少重复代码的编写。方法引用是一个更加紧凑、易读的Lambda表达式。其中方法引用的操作符是双冒号”::”。

2.1 方法引用的格式

通过类名或对象名引用

类名::方法名         或   对象名::方法名

2.2方法引用的四种类型

(a)   静态方法引用:通过类名引用

(b)   对象方法引用:通过对象名应用

(c)    特定类型的实例方法引用

(d)   构造方法的引用

2.3静态方法引用

通过类名引用已经存在的静态方法,格式:类名::静态方法

2.3.1静态方法引用内部实现步骤

(a)   创建了一个类实现了函数式接口,重写接口中的抽象方法;在重写的方法中调用了被引用的方法

(b)   创建实现类对象

2.3.2静态方法引用注意事项

被引用的方法和函数接口中的抽象方法必须有相同参数列表。

如果函数式接口中的抽象方法有返回值,则被引用的方法也必须有返回值。如果函数式接口中的抽象方法没有返回值,则被引用的方法可以有返回值,也可以没有返回值。

2.4对象方法引用

通过类名引用已经存在的成员方法对象名::成员方法

 

2.5构造方法引用

构造方法本质上是静态方法。构造方法引用格式:类名::new

比如:Student::new

2.6特定类型的方法引用

 语法格式:类名::实例方法名

 

类名::实例方法名这种方法引用的特殊之处:当使用类名::实例方法名方法引用是,一定是Lambda表达式所接收的第一个参数来调用实际方法,如果Lambda表达式接收多个参数,其余的参数作为方法的参数传递进去。

 

特定类型的实例方法引用注意事项:

被引用的方法和函数式接口中的方法要相差一个参数,被引用的调用者是Lambda表达式中的第一个参数调用,其余参数作为被引用的参数传递。

2.7 通过this引用成员方法

this代表当前对象,如果需要引用的方法就是当前类中的成员方法,那么就可以使用“this::成员方法”的格式来使用方法引用

 

2.8 通过super引用成员方法

如果存在继承关系,当Lambda中需要出现super调用时,也可以使用方法引用来替代。格式是:       super::成员方法

 

2.9 数组构造器引用

3、常用函数式接口

JDK提供了大量常用的函数式接口以及丰富Lambda的典型使用场景,它们主要在java.util.function包中提供。

3.1 Supplier接口

java.util.function.Supplier<T>接口仅包含一个无参的方法: T get()。用来获取一个泛型参数指定类型的对象数据。由于这是一个函数式接口,这也就意味着对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象。

 

3.2 Consumer接口

       java.util.function.Consumer<T>接口跟Supplier接口刚好相反,它不是生产一个数据,而是消费一个数据,其它数据类型由泛型参数决定。

 

       抽象方法:

(a)   void accept(T t)    消费一个指定泛型的数据

(b)   default Consumer<T> andThen​(Consumer<? super T> after)          如果一个方法的参数和返回值全都是Consumer类型,那么就可以实现效果:消费一个数据的时候,首先做一个操作,然后再做一个操作,实现组合。而这个方法就是Consumer接口中default方法andThen。

4、 小结

4.1方法引用的好处

简化Lambda表达式

重复利用已经存在方

4.2 函数式接口、Lambda表达式、方法引用之间的联系

接口:主要是定义统一的调用规范,所以接口方法的名字一般是长期固定不变,且需要经常调用。

接口方法的具体实现在项目中经常变动,所以用接口方法名调用接口实现类的重写方法,可以起到少改动项目代码的效果。

因为函数式接口中只有一个抽象方法,所以Lambda表达式、方法引用可以省略掉接口中唯一的抽象方法的名字。Lambda表达式、方法引用都是只定义了方法的实现,但是没有调用方法。

Lamda表达式、方法引用的实际调用,一般是用接口实现类对象调用接口唯一抽象方法名。

day012-Lambda、方法引用的更多相关文章

  1. JAVA 8 主要新特性 ----------------(五)Lambda方法引用与构造器引用

    一.Lambda方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!) 方法引用: 使用操作符 “::” 将 ...

  2. java8 lambda方法引用

    注意引用方法的参数列表与返回值类型要与函数式接口中的抽象方法的参数列表与返回值类型保持一致 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实例方法名 pub ...

  3. Java自学-Lambda 方法引用

    Lambda 方法引用 步骤 1 : 引用静态方法 首先为TestLambda添加一个静态方法: public static boolean testHero(Hero h) { return h.h ...

  4. Lambda 方法引用

    1.方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用“引用方法”(可以理解为方法引用是Lambda表达式的另外一种表现形式) 方法引用主要有三种语法格式: ①  对象 :: 实例方法 ...

  5. Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法

    本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...

  6. Java8新特性 -- Lambda 方法引用和构造器引用

    一. 方法引用: 若Lambda体中的内容有方法已经实现了,我们可以使用“方法引用” 要求 方法的参数和返回值类型 和 函数式接口中的参数类型和返回值类型保持一致. 主要有三种语法格式: 对象 :: ...

  7. 第九章 Lambda&方法引用

    9.1.Lambda表达式 9.1.1.标准格式 (形式参数) -> {代码块} 9.1.2.使用前提 有一个接口并且接口中有且仅有一个抽象方法 9.1.3.常见应用 9.1.3.1.无参无返回 ...

  8. Lambda 方法引用 构造器引用 数组引用

    一.方法引用 注意: 1.Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口中的抽象方法的函数列表和返回值保持一致!2.若Lambda 参数列表中的第一个参数是实例方法的调用者,而第二个 ...

  9. Java笔记——Java8特性之Lambda、方法引用和Streams

    Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...

  10. Java8特性之Lambda、方法引用和Streams

    这里涉及三个重要特性: Lambda 方法引用 Streams ① Lambda 最早了解Lambda是在C#中,而从Java8开始,Lambda也成为了新的特性,而这个新的特性的目的,就是为了消除单 ...

随机推荐

  1. 119th LeetCode Weekly Contest Subarray Sums Divisible by K

    Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have a sum ...

  2. Zabbix触发器函数之count函数

    一.背景 zabbix监控中我们用的最多的是count这个函数,通过确认多次可以减少很多误告警,提高了运维效率.可以设置连续几次都异常才发出告警,这样一来,只要发出告警基本上就已经确定发生故障了. 二 ...

  3. jq api --css

    .css() $("p").css("color","red"); $("p").css({ "color&q ...

  4. mysql安装 2018最新安装mysql教程及遇到的问题解决Windows下

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8094659.html 今天因为换了个LINUX系统 把我的E盘不小心给卸载了 结果还是不能用 ...

  5. org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.

    今天报了这个异常,这是页面报的 org.springframework.dao.DataIntegrityViolationException: could not execute statement ...

  6. SpringBoot | 第三十三章:Spring web Servcies集成和使用

    前言 最近有个单位内网系统需要对接统一门户,进行单点登录和待办事项对接功能.一般上政府系统都会要求做统一登录功能,这个没啥问题,反正业务系统都是做单点登录的,改下shiro相关类就好了.看了接入方案, ...

  7. Visual Studio中C++项目编译常见问题总结

    1. 工程引用外部头文件 工程->属性->配置属性->C/C++ ->常规->附加包含目录:输入头文件存放目录 2. 添加lib库引用 添加lib库的路径:工程-> ...

  8. ASP .NET SVN && emmet 插件

    学习  ASP .NET 时间的第三周: 来讲讲如何在 visual studio 2013...上搭载 SVN吧: 废话不多说: One Step: 电脑上已安装 visual studio 201 ...

  9. solidity数据类型

    1.Bool类型 取值:true/false 运算符:!  && || == != 2.Integer整型 uint8-uint256 int8-int256 uint == uint ...

  10. 将代码托管到github,并生成链接访问

    转眼间加入github的阵营已经两年多了,看到别人建立的个人博客挺好看的,因此,自己从此喜欢上了github,总结下自己的相关知识. 推荐学习Git的网址: 猴子都能懂的GIT入门 http://ba ...