基本概念

格式

实例变量名 | 类名 :: 静态方法 | 实例方法

作用

简化Lambda表达式

示例

a -> System.out.println(a); <=> System.out::println



(a, b) -> a.compareTo(b); <=> String::compareTo;

形式

方法引入总共有四种表现形式:

类型 示例
引用静态方法 ContainingClass::staticMethodName
引用某个对象的实例方法 containingObject::instanceMethodName
引用某个类型的任意对象的实例方法 ContainingType::methodName
引用构造方法 ClassName::new

应用

POJO

public class Emp {
private int empno;
private String ename;
//其余方法略
}

引用静态方法####

	@FunctionalInterface
public interface StaticMethod {
int min(int a, int b);
} StaticMethod staticMethod = (a, b) -> Math.min(a,b);
StaticMethod staticMethod1 = Math::min;

引用某个对象的实例方法

@FunctionalInterface
public interface InstanceMethodOfParticularObject {
void setEmpName(String name);
} Emp emp = new Emp(1,"eName"); //普通Lambda表达式
InstanceMethodOfParticularObject instanceMethodOfParticularObject = name -> emp.setEname(name);
instanceMethodOfParticularObject.setEmpName("haha");
System.out.println(emp.getEname()); //方法引入--引用某个对象的实例方法
InstanceMethodOfParticularObject instanceMethodOfParticularObject1 = emp::setEname;
instanceMethodOfParticularObject1.setEmpName("xixi");
System.out.println(emp.getEname());

引用某个类型的任意对象的实例方法

@FunctionalInterface
public interface InstanceMethodOfArbitraryObject {
boolean equale(String a,String b);
} InstanceMethodOfArbitraryObject instanceMethodOfArbitraryObject = (a, b) -> a.equals(b);
InstanceMethodOfArbitraryObject instanceMethodOfArbitraryObject1 = String::equals; System.out.println(instanceMethodOfArbitraryObject1.equale("a","b"));
System.out.println(instanceMethodOfArbitraryObject.equale("a","a"));

引用构造方法

@FunctionalInterface
public interface ConstructorWithFullFields {
Emp getNewEmp(int empno,String ename);
} //无参构造
ConstructorWithNoField<Emp> constructorWithNoField = ()-> new Emp();
ConstructorWithNoField<Emp> constructorWithNoField1 = Emp::new; //全参构造
ConstructorWithFullFields constructorWithFullFields = ((empno, ename) -> new Emp(empno,ename));
ConstructorWithFullFields constructorWithFullFields1 = Emp::new;

总结

  1. 一般情况下,用方法引入代替普通Lambda表达式均满足以下条件:

    1. 返回值类型相同
    2. 参数类型及个数相同

比如第1/2/4种形式。

  1. 第3种形式比较特殊,需满足以下条件:

    1. 返回值类型相同
    2. 两个参数
    3. 类型相同

因此会自动适配,否则会报错,如:Non-Static method cannot be referenced from a static context

参考

  1. Method References
  2. 30分钟入门Java8之方法引用

Java8学习笔记(三)--方法引入的更多相关文章

  1. Java8学习笔记(八)--方法引入的补充

    在Java8学习笔记(三)--方法引入中,简要总结了方法引入时的使用规则,但不够完善.这里补充下几种情况: 从形参到实例方法的实参 示例 public class Example { static L ...

  2. angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令

    在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...

  3. Java8学习笔记目录

    Java8学习笔记(一)--Lambda表达式 Java8学习笔记(二)--三个预定义函数接口 Java8学习笔记(三)--方法引入 Java8学习笔记(四)--接口增强 Java8学习笔记(五)-- ...

  4. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  5. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  6. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  7. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  8. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  9. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  10. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

随机推荐

  1. Python解释数学系列——分位数Quantile

    跳转到我的博客 1. 分位数计算案例与Python代码 案例1 Ex1: Given a data = [6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36],求Q1, ...

  2. 解决AD9中“......has no driver”的问题

  3. C++学习笔记41:进程调度

    进程调度策略:先进先出,时间片轮转,普通调度,批调度,高优先级抢先 子进程与父进程的调度没有固定的顺序:不能假设子进程一定会在父进程之后执行,也不能假设子进程一定会在父进程之前执行: 僵尸进程 子进程 ...

  4. solr中的一些常见错误

    (1)Caused by: java.lang.ClassNotFoundException: Unable to load jdbcDataSource or org.apache.solr.han ...

  5. 【熊掌号mip插件】织梦DEDECMS百度熊掌号mip改造教程

    第一部分:模板修改 1.js部分:删除或使用现有组件替换 2.调用百度mip文件: head里加<link rel="stylesheet" type="text/ ...

  6. linux中apt-get和yum和wget的区别

    1.RedHat系列:Redhat.Centos.Fedora等   yum 2.Debian系列:Debian.Ubuntu等   apt-get wget类似迅雷

  7. copy unicode HTML to clipboard

    How to copy unicode HTML code to the clipboard in html format, so it can be pasted into Writer, Word ...

  8. android: 碎片的demo

    现在你已经将关于碎片的重要知识点都掌握得差不多了,不过在灵活运用方面可能还有 些欠缺,因此又该进入我们本章的最佳实践环节了. 前面有提到过,碎片很多时候都是在平板开发当中使用的,主要是为了解决屏幕空间 ...

  9. CentOS 的 /etc/profile 和 ~/.bash_profile 及 .zshrc

    交互式登陆shell 对于交互式的登陆shell而言,CentOS规定了startup文件的加载顺序如下: 登陆过程: 1. 读取并执行/etc/profile文件: 2. 读取并执行~/.bash_ ...

  10. ARouter原理剖析及手动实现

    ARouter原理剖析及手动实现 前言 路由跳转在项目中用了一段时间了,最近对Android中的ARouter路由原理也是研究了一番,于是就给大家分享一下自己的心得体会,并教大家如何实现一款简易的路由 ...