1 方法引用

  1.1 方法引用的好处

    方法引用结合 Lambda 可以引用已存在的方法,省略很多编码,而且可读性更强,它可以自动装配参数与返回值。

    在编写lambda表达式的时候可以通过方法引用的方式来简化编写流程,例如:

  1.2 静态方法引用

    格式 -> 类名 :: 方法名

    1.2.1 创建一个Student类

class Student {

    private String name = "王杨帅";

    public static void info(Student student) {
System.out.println(student.name + "正在学习IT技能");
} @Override
public String toString() {
return this.name;
}
}

  1.2.2 引用

    在Lambda表达式中引用Student类中的静态方法info

    Student :: info

    技巧01:info 方法是一个静态方法,它的参数中没有this

    技巧02:info 方法接收一个Student类型的参数,没有返回参数;所以 Student :: info 这个引用的结果是一个Consumer类型的实例

package demo_test;

import java.util.function.Consumer;
import java.util.function.Supplier; /**
* @author 王杨帅
* @create 2018-07-30 9:54
* @desc
**/
public class TestDemo02 { public static void main(String[] args) { Student student = new Student(); Consumer<Student> consumer = Student :: info; consumer.accept(new Student()); } } class Student { private String name = "王杨帅"; public static void info(Student student) {
System.out.println(student.name + "正在学习IT技能");
} @Override
public String toString() {
return this.name;
}
}

  1.3 实例方法引用

    格式 -> 实例名 :: 方法名

    1.3.1 重构Student类

      新增一个money成员变量,新增一个useMoney成员方法

class Student {

    private String name = "王杨帅";
private Double money = 100d; public static void info(Student student) {
System.out.println(student.name + "正在学习IT技能");
} public Double useMoney(Double money) {
System.out.println(this.name + "花了" + money + "元");
return this.money -= money;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getMoney() {
return money;
} public void setMoney(Double money) {
this.money = money;
} @Override
public String toString() {
return this.name;
}
}

    1.3.2 引用01【推荐方式】

      利用实例变量引用

      》创建一个Student实例student

      》引用格式:student :: useMmoney

      》技巧01:useMoney方法接收一个Double类型参数,返回一个Double类型的参数;所以 student :: useMmoney 引用返回的结果应该是一个Function类型的实例

package demo_test;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier; /**
* @author 王杨帅
* @create 2018-07-30 9:54
* @desc
**/
public class TestDemo02 { public static void main(String[] args) { // demo01(); Student student = new Student();
Function<Double, Double> function = student :: useMoney;
System.out.println(student.getName() + "还剩下" + function.apply(10d) + "元"); } /**
* 静态方法的引用
*/
public static void demo01() {
Student student = new Student(); Consumer<Student> consumer = Student :: info; consumer.accept(new Student());
} } class Student { private String name = "王杨帅";
private Double money = 100d; public static void info(Student student) {
System.out.println(student.name + "正在学习IT技能");
} public Double useMoney(Double money) {
System.out.println(this.name + "花了" + money + "元");
return this.money -= money;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getMoney() {
return money;
} public void setMoney(Double money) {
this.money = money;
} @Override
public String toString() {
return this.name;
}
}

    1.3.3 引用02【不推荐使用】

      利用类来引用

      》实体类不做任何修改

      》引用格式:Student :: useMoney

      》技巧01:由于useMoney里面用到了this关键字,所以在利用类名来引用实例方法时必须传入一个Student类型的实参,Student类中的userMoney方法不需要进行更改是因为JDK会默认给实例方法第一个参数设为this;所以 Student :: useMoney 返回的是一个 BiFunction 类型的实例

package demo_test;

import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier; /**
* @author 王杨帅
* @create 2018-07-30 9:54
* @desc
**/
public class TestDemo02 { public static void main(String[] args) { // demo01(); // demo02(); BiFunction<Student, Double, Double> biFunction = Student :: useMoney;
Student student = new Student();
System.out.println(student.getName() + "还剩下" + biFunction.apply(student, 11d) + "元"); } /**
* 实例引用01【推荐方式】
*/
public static void demo02() {
Student student = new Student();
Function<Double, Double> function = student :: useMoney;
System.out.println(student.getName() + "还剩下" + function.apply(10d) + "元");
} /**
* 静态方法的引用
*/
public static void demo01() {
Student student = new Student(); Consumer<Student> consumer = Student :: info; consumer.accept(new Student());
} } class Student { private String name = "王杨帅";
private Double money = 100d; public static void info(Student student) {
System.out.println(student.name + "正在学习IT技能");
} public Double useMoney(Double money) {
System.out.println(this.name + "花了" + money + "元");
return this.money -= money;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getMoney() {
return money;
} public void setMoney(Double money) {
this.money = money;
} @Override
public String toString() {
return this.name;
}
}

  1.4 构造器的引用

    格式 -> Student :: new

    1.4.1 重构Student类

      添加一个无参构造器和有参构造器

class Student {

    private String name = "王杨帅";
private Double money = 100d; public Student() {
} public Student(String name, Double money) {
this.name = name;
this.money = money;
} public static void info(Student student) {
System.out.println(student.name + "正在学习IT技能");
} public Double useMoney(Double money) {
System.out.println(this.name + "花了" + money + "元");
return this.money -= money;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getMoney() {
return money;
} public void setMoney(Double money) {
this.money = money;
} @Override
public String toString() {
return this.name;
}
}

    1.4.2 无参构造器的引用

      》引用格式:Student :: new

      》无参构造器没有输入参数,输出参数是一个Student类型,所以 Student :: new 的返回的是一个 Supplier 类型的实例

package demo_test;

import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier; /**
* @author 王杨帅
* @create 2018-07-30 9:54
* @desc
**/
public class TestDemo02 { public static void main(String[] args) { // demo01(); // demo02(); // demo03(); Supplier<Student> supplier = Student :: new;
System.out.println(supplier.get()); } /**
* 实例引用02【不推荐使用】
*/
public static void demo03() {
BiFunction<Student, Double, Double> biFunction = Student :: useMoney;
Student student = new Student();
System.out.println(student.getName() + "还剩下" + biFunction.apply(student, 11d) + "元");
} /**
* 实例引用01【推荐方式】
*/
public static void demo02() {
Student student = new Student();
Function<Double, Double> function = student :: useMoney;
System.out.println(student.getName() + "还剩下" + function.apply(10d) + "元");
} /**
* 静态方法的引用
*/
public static void demo01() {
Student student = new Student(); Consumer<Student> consumer = Student :: info; consumer.accept(new Student());
} } class Student { private String name = "王杨帅";
private Double money = 100d; public Student() {
} public Student(String name, Double money) {
this.name = name;
this.money = money;
} public static void info(Student student) {
System.out.println(student.name + "正在学习IT技能");
} public Double useMoney(Double money) {
System.out.println(this.name + "花了" + money + "元");
return this.money -= money;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getMoney() {
return money;
} public void setMoney(Double money) {
this.money = money;
} @Override
public String toString() {
return this.name;
}
}

    1.4.3 有参构造器的引用

      》引用格式:Student :: new

        疑惑:为什么有参构造器和无参构造器的输入参数都不一样,为什么引用格式一样呢?

        解惑:lambda表达式的引用会自动进行以引用类型判断,自己去寻找符合条件的方法执行,开发人员无需担心弄错

      》有参构造器有两个输入参数,输出参数也是一个Student类型,所以 Student :: new  返回的是一个  BiFunction 类型的实例

package demo_test;

import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier; /**
* @author 王杨帅
* @create 2018-07-30 9:54
* @desc
**/
public class TestDemo02 { public static void main(String[] args) { // demo01(); // demo02(); // demo03(); BiFunction<String, Double, Student> biFunction = Student :: new;
System.out.println(biFunction.apply("三少", 100d)); } /**
* 实例引用02【不推荐使用】
*/
public static void demo03() {
BiFunction<Student, Double, Double> biFunction = Student :: useMoney;
Student student = new Student();
System.out.println(student.getName() + "还剩下" + biFunction.apply(student, 11d) + "元");
} /**
* 实例引用01【推荐方式】
*/
public static void demo02() {
Student student = new Student();
Function<Double, Double> function = student :: useMoney;
System.out.println(student.getName() + "还剩下" + function.apply(10d) + "元");
} /**
* 静态方法的引用
*/
public static void demo01() {
Student student = new Student(); Consumer<Student> consumer = Student :: info; consumer.accept(new Student());
} } class Student { private String name = "王杨帅";
private Double money = 100d; public Student() {
} public Student(String name, Double money) {
this.name = name;
this.money = money;
} public static void info(Student student) {
System.out.println(student.name + "正在学习IT技能");
} public Double useMoney(Double money) {
System.out.println(this.name + "花了" + money + "元");
return this.money -= money;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getMoney() {
return money;
} public void setMoney(Double money) {
this.money = money;
} @Override
public String toString() {
return this.name;
}
}

2 类型判断

  lambda表达式的返回结果是一个函数式接口类型的实例,lambda表达式的结果具体对应哪一个函数式接口类型有JDK自己进行判断;当然开发者如果清楚自己在做什么可以对lambda表达式的记过进行强制类型转换。

  2.1 准备代码

    》创建两个函数式接口

interface IMatch {
Integer add(Integer a, Integer b);
} interface IMatch02 {
Integer add(Integer a, Integer b);
}

  2.2 类型判断分类

    2.2.1 变量赋值

    2.2.2 数组定义

    2.2.3 强制转换

    2.2.4 方法返回值

    2.2.5 实际使用

      一个方法的参数是一个函式接口,我们就可以利用lambda表达式了类型推断来实现;这种方式其实和类型定义是一样的

      技巧01:重载方法引起lambda表达式不知道应该对应哪个函数接口时可以通过强制类型转化来实现

3 变量引用

  3.1 在lambda表达式中使用this关键字

    3.1.1 lambda表达式中this指向的是当前类

      原因:lambda 表达式是函数式接口的实现类实例,所以,定义 lambda 表达式,实际上要经历两件事情。第一件事情是定义函数式接口实现类,第二件事情是创建该实现类实例。 this 称之为当前对象,但是, 定义 lambda 表达式时,也就是定义函数式接口实现类时, lambda 表达式代表的实现类本身没有 this 对象,此时若是使用 this 对象,指的是把 lambda 表达式围住的类的当前对象,而不是 lambda 表达式代表的实现类的当前对象。

    /**
* notes:
* 1 java是传值的
* 2 匿名内部类中的this是指向内部类,lambda表达式的this是执行当前类
* 3 匿名内部类和lambda表达式引用当前类的变量时都需要时final修饰的成员,java8开始
* 可以不用final修饰,是因为jdk在编译的时候帮我们做了
* 4 引用的成员需要final修饰的原因时保证当前类的成员变量和匿名内部类或者labmda表达
* 式中应用的变量都指向同一个对象,如果没有final修饰,就很容易导致两个变量执行不同的变量,
* 从而导致程序出现一些bug
*/

Lambda03 方法引用、类型判断、变量引用的更多相关文章

  1. php引用计数与变量引用

    每个php5.5变量都存储在一个叫做zval的变量容器中. 一个zval变量容器,除了包含变量的类型与值外,还包含两个字节的额外信息: 1.第一个是“is_ref”,是个bool型,用来标识这个变量是 ...

  2. console.log、toString方法与js判断变量类型

    Java调用system.print.out()是会调用toString方法打印js里的console.log也是控制台打印,很多时候,我们以为也是调用toString方法,其实并不是.我们在chro ...

  3. JavaScript中判断变量类型最简洁的实现方法以及自动类型转换(#################################)

    这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...

  4. C# 异常:从作用域“”引用了“FiasHostApp.Entity.DBEntity.FIAS_RM_v1.ITraNetMgrUnitBaseInfoRecord”类型的变量“w”,但该变量未定义

    C# 异常:从作用域“”引用了“FiasHostApp.Entity.DBEntity.FIAS_RM_v1.ITraNetMgrUnitBaseInfoRecord”类型的变量“w”,但该变量未定义 ...

  5. python list类型的变量相当于全局变量 可以被函数与类引用

    python list类型的变量相当于全局变量 可以被函数与类引用

  6. Java 中 父类变量访问子类方法 需要使用 类型转换 (instenceof)关键字 /类型判断/

    通过数组元素访问方法的时候只能访问在 Animal中定义的方法,对 于 Tiger类和  Fish中定义的方法时却不能调用,例如语句  animal[2].swim();就是不正确的.当 需要访问这些 ...

  7. JS 中对变量类型判断的几种方式

    文章整理搬运,出处不详,如有侵犯,请联系~   数据类型判断和数据类型转换代码工具 在 JS 中,有 5 种基本数据类型和 1 种复杂数据类型,基本数据类型有:Undefined, Null, Boo ...

  8. 关于java内存泄露的总结--引用的类型:强引用,弱引用,软引用

    今天面试了一家公司的java开发方面的实习生,被问到一个问题:如何处理java中的内存泄露问题,保证java的虚拟机内存不会被爆掉,当时其实觉得面试官的问题有点泛,所以也没有很好领会他的意思,答案也不 ...

  9. 2.8 补充:shell变量引用方式

    一 变量   变量:本质上是程序中保存用户数据的一块内存空间,变量名就是内存空间地址.   Shell中:变量可由字母数字和下划线组成,以字母或下划线开头.   命名:PATH=/sbin       ...

随机推荐

  1. make: *** No rule to make target `out/target/common/obj/APPS/framework-res_intermediates/src/R.stamp'

    /********************************************************************************** * make: *** No r ...

  2. vue前端开发那些事——vue组件开发

    vue的学习曲线不是很陡(相比其它框架,如anglarjs),官方文档比较全面,分为基础篇和高级篇.我们刚开始学习的时候,肯定像引用jquery那样,先把vue的js引进来,然后学习基础内容.如果仅仅 ...

  3. 由于出现操作系统错误 3,进程无法读取文件D:\XXXX\X.pre (源: MSSQL_REPL,错误号: MSSQL_REPL20024)

    最近着手做SqlServer2008的订阅发布,起初使用推送订阅很顺利,后来改成请求订阅出现了以下问题,折腾好长时间终于搞定,留下此文备日后查阅,或供遇相同问题的道友参考: 首先阐述以下问题: 1. ...

  4. matlab的fda工具使用方法

    MATLAB中用FDATool设计滤波器及使用 该文章讲述了MATLAB中用FDATool设计滤波器及使用. 1. 在Matlab中键入fdatool运行Filter Design and Analy ...

  5. python 不同版本下载资源

    Unofficial Windows Binaries for Python Extension Packages by Christoph Gohlke, Laboratory for Fluore ...

  6. ubantu 虚拟机无法查看windows共享目录

    初学linux,安装好虚拟机,安装好ubantu系统,启动系统后无法查看windows共享目录. 原因是没有安装 vmware tools 教程地址:http://www.linuxidc.com/L ...

  7. PCB 封装中的 公差符号形位公差位置度

    PCB 封装中的 公差符号形位公差位置度 0.08 旁边的 十字加圆就是位置度的形位公差.

  8. nginx config的多个config配置

    在我们的一台服务器上,一个nginx服务器下面可能跑着许多许多的项目; 那么就需要配置多个对应的配置 端口号 已经文件入库目录等等 那么项目多了以后,把这些项目都写到一个文件里 到后期难以查看与管理 ...

  9. redis事务和redis集群

    一.事务(相对mysql来说简单) 1. 比较 ①:mysql ----->start trantation ---->普通sql ------->回滚rollback------& ...

  10. Navicat设定mysql定时任务步骤示例

    怎样在Navicat中设置,是数据库按照记录中的日期更新状态字段 其实这个很常用,比如你网站里的某条记录的日期——比如说数据库中某条活动记录的审核日期字段已经过期,亦即当前时间已经超过审核日期,那么定 ...