什么是方法引用

  方法引用可以被看作仅仅调用特定方法的Lamdba表达式的一种快捷方式。比如说Lamdba代表的只是直接调用这个方法,最好还是用名称来调用它,可不用用对象.方法名(),方法引用,引用:就是让你跟据已有的方法来创建一个Lamdba表达式。

  并且这么做还有一个好处,就是可以更加清晰明白的理解这行代码的意思。让代码变的优雅起来。

方法引用的简单使用

//比如说有一个Person类,里面有一个getName()方法。
//用Lamdba来使用:用函数类型接口
Function<Person,String> function = (x) -> x.getName();
//等效的方法引
Function<Person,String> function = Person::getName;
//用Lamdba来使用
() -> Thread.currentThread().dumpStack()
//等效的方法引用
() -> Thread.currentThread::dumpStack
//用Lamdba来使用
(str,i) -> str.substring(i)
//等效的方法引用
(str,i) -> String::sbustring;
//经常使用的集合的输出
list.forEach(System.out::println)

上面的小例子来自 《Java8实战》

方法引用的构建

  • 指向静态方法的引用。(引用类型中的方法,如:Integer中的sum,min,max等)
  • 指向任意类型实例方法的引用(只要传进来,可以用lamdba,就可以用方法引用)
  • 指向现有对象的实例方法的引用(自己定义的对象,传进lamdba表达式以后,就可以用方法引用了)

有参数的情况下,编译器会进行类型检查,来确定对于给定的函数式接口,这个方法引用是否有效,并且参数类型是否于上下文匹配。

使用方法引用来构建一个对象

在这里先定义一个javabean,Person ,属性有两个 name , sex ,有一参构造方法,有两参构造方法,无参构造方法

  • 用无参方法构建一个对象
    @Test
public void test2() {
Supplier<Person> supplier = Person::new;
Person person = supplier.get();
}
  • 用一个参数的构造方法来构建一个对象
    @Test
public void test2() {
Function<String, Person> function = Person::new;
Person person = function.apply("张三");
System.out.println(person.getName());
//最后输出:张三
}
  • 用二个参数的构造方法来构建一个对象

BiFunction<T,U,R> 两个参数来构建一个对象,得用这个函数式接口:

  T:第一个参数类型

  U:第二个参数类型

  R:返回值类型

    @Test
public void test2() {
BiFunction<String,String, Person> function = Person::new;
Person person = function.apply("张三","男");
System.out.println(person.getName());
System.out.println(person.getSex());
//输出:张三 男
}
  • 如果用多个参数来构建对象(三个或者三个以上)就必须自己写一个函数式接口
//自定义一个函数接口
@FunctionalInterface
public interface ThreeFuntion <T,U,E,R> {
R apply(T t,U u,E e);
//T:第一个参数类型
//U:第二个参数类型
//E:第三个参数类型
//R:返回值类型
}

细节决定成败!

个人愚见,如有不对,恳请扶正!

Java8 新特性 方法引用的更多相关文章

  1. JAVA8新特性——方法引用

    JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 在Lamda新特性的支持下,JAVA8中可以使用lamda表达式来创建匿名方法.然而,有时候我们仅仅是需要调用一个已存在的方法(如 ...

  2. java8新特性——方法引用与构造器引用

    上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题.今天来简单学习一下方法引用与构造器引用. 一.方法引用 方法引用:若lambda 体中得内容已经 ...

  3. java8新特性-方法引用

    方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用 (可以将方法引用理解为 Lambda 表达式的另外一种表现形式) 1. 对象的引用 :: 实例方法名2. 类名 :: 静 ...

  4. Java8新特性 - 方法引用与构造器引用

    方法引用 若Lambda体中的内容有方法已经实现了,我们可以使用"方法应用",可以理解为方法引用是Lambda表达式的另外一种表现形式. 使用操作符"::"将方 ...

  5. Java8新特性之方法引用&Stream流

    Java8新特性 方法引用 前言 什么是函数式接口 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即:非运行 ...

  6. Java8新特性—四大内置函数式接口

    Java8新特性--四大内置函数式接口 预备知识 背景 Lambda 的设计者们为了让现有的功能与 Lambda 表达式良好兼容,考虑了很多方法,于是产生了函数接口这个概念. 什么是函数式接口? 函数 ...

  7. Java8新特性之二:方法引用

    上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...

  8. 乐字节-Java8新特性之方法引用

    上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...

  9. 乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

随机推荐

  1. python 函数式编程 闭包,返回一个函数

    参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017434209254976 作业 #使用生成器 def createCounter( ...

  2. log4net 写数据到sql数据库

    最近需要把用户的一些行为添加到数据库中,所以想到了用log4net ,如果有别的好的方案,大家可以给我指正. 先看一下配置文件 我这个是控制台文件 app.config <layout type ...

  3. day 48

    目录 js BOM(浏览器对象模型) window对象 window子对象 弹出框 计时事件 DOM(文档对象模型) 查找标签 节点操作 事件 常用事件 绑定方式 jQuery jQuery介绍 jQ ...

  4. React学习笔记③

    生命周期的理解 class App extends Component{ constructor(){ console.log("constructor") //初始化属于组件的属 ...

  5. wait waitpid

    定义 pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); 暂时停止进程的执行,直到有信号来到或子进 ...

  6. Guava工具类学习

    目录 一.介绍 二.Optional类 1.定义 2.java8自带Optional 3.使用 三.Preconditions类 1.定义 2.使用 四.Ordering类 1.定义 2.使用 五.R ...

  7. mysql中的where和having的区别

    下面以一个例子来具体的讲解: 1. where和having都可以使用的场景 1)select addtime,name from dw_users where addtime> 1500000 ...

  8. windows校验文件的值

    Windows校验文件值的三种方式 win键+R键输入cmd调出命令行 查看MD5值: certutil -hashfile 文件名 MD5 查看 SHA1 certutil -hashfile 文件 ...

  9. 团队第四次作业:alpha1发布成绩汇总

    一.作业题目 团队第四次作业:alpha1发布 二.作业评分标准 博客评分规则(总分100)博客要求 给出开头和团队成员列表(10') 给出发布地址以及安装手册(20') 给出测试报告(40') 给出 ...

  10. 用 tomcat 部署 Jenkins

    在tomcat 下面部署 Jenkins 版本 tomcat (7.0.94) +  jdk (7) + jenkins (2.46.3) 前两次没有部署成功,应该是 jdk 版本的问题, 如果不成功 ...