什么是方法引用

  方法引用可以被看作仅仅调用特定方法的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新特性之二:方法引用

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

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

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

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

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

  8. Java8新特性(一)_interface中的static方法和default方法

    什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...

  9. 乐字节-Java8新特性-接口默认方法之Stream流(下)

    接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...

随机推荐

  1. Linux文件与目录管理

    .      代表此层目录 . .     代表上一层目录 -      代表前一个工作目录 ~     代表"目前用户身份"所在的中文件夹 ~account   代表accoun ...

  2. QT5.1 调用https

    以VS开发为例.因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com ...

  3. Android sdk资源包res里面的drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi)

    (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854) (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x ...

  4. springmvc学习笔记--mybatis--使用插件自动生成实体和mapper

    由于表对象在开发过程中会增删字段,有时候需要重新生成实体和对应的mapper,这时候可以通过mybatis的插件的生成. 优点是快速简洁,缺点同样很明显:覆盖.因此,通常是在第一次搭建框架的时候使用, ...

  5. I/O多路复用——epoll函数

    1 select的低效率 select/poll函数效率比较低,主要有以下两个原因: (1)调用select函数后需要对所有文件描述符进行循环查找 (2)每次调用select函数时都需要向该函数传递监 ...

  6. Python环境安装及基本概念

    1.安装Python ①官网下载Python包安装 ②添加环境变量(新版Python包可直接添加环境变量) 手动添加环境变量:控制面板-系统-高级系统设置-环境变量-编辑Path添加python安装目 ...

  7. DBA Scripts

    标记一下,慢慢研究 http://www.oracle-base.com/dba/scripts.php Monitoring access.sql active_sessions.sql cache ...

  8. 【git】------git的基本介绍及linux的基本命令------【巷子】

    001.git简介 git是一款开源的分布式版本控制工具 在世界上所有的分布式版本控制工具中,git是最快.最简单.最流行的 git的起源 作者是Linux之父:Linus Benedict Torv ...

  9. hdu 5875(单调栈)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  10. java基础之JDBC六:DBCP 数据库连接池简介

    我们之前写的代码中的数据库连接每次都是自己创建,用完以后自己close()销毁的,这样是很耗费资源的,所以我们引入DBCP DBCP简介 概述: Data Base Connection Pool, ...