什么是方法引用

  方法引用可以被看作仅仅调用特定方法的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. EF自动创建数据库步骤之四(启用数据库初始器)

    在创建完DBIfNotExistsInitializer数据库初始化器类后,需要在程序每一次访问数据库前,告诉EF使用该初始化器进行初始化. 代码如下 : Database.SetInitialize ...

  2. CTF——web安全中的一些绕过

    function check($number) { $one = ord('1'); $nine = ord('9'); for ($i = 0; $i < strlen($number); $ ...

  3. while(n)什么意思?

    1.n是bool型变量时,就是代表n为true时运行循环(bool表示布尔型变量,也就是逻辑型变量的定义符,以英国数学家.布尔代数的奠基人乔治·布尔(George Boole)命名. bool类似于f ...

  4. 剑指:包含min函数的栈(min栈)

    题目描述 设计一个支持 push,pop,top 等操作并且可以在 O(1) 时间内检索出最小元素的堆栈. push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 get ...

  5. django2外键,F表达式,Q表达式

    一对多 环境 两个类:书的类别和文章,一片文章只能有一个作者,一个作者可以有多个文章,这之间组成了一对多的关系 class Category(models.Model): category = mod ...

  6. eclipse 工作空间配置UTF-8编码格式

    配置前端页面编码格式 1. Windows-->preferences 2. web-->jsp file-->Encoding 3. OK保存  配置java文件编码格式 1. W ...

  7. 让configure和cmake编译时支持调试选项

    在Linux先编译软件基本都是采用configure文件生成makefile,或者,cmake生成makefile文件两种方式.它们生成的makefile文件,一般默认不支持-g调试选项.但我们使用这 ...

  8. [转]【response】HttpServletResponse接口

    创建时间:6.19 & 6.24 1.HttpServletResponse概述 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参 ...

  9. Fluter基础巩固之Dart语言详解<二>

    继续学习枯燥的Dart语言语法,目前的耐得住寂寞是为了将来学得“爽”做准备的!!! 异常: Dart 提供了 Exception 和 Error 类型, 以及一些子类型.还可以定义自己的异常类型.但是 ...

  10. CefSharp 屏蔽右键菜单

    既然是C#+web混用模式,当然就需要把web的右键操作屏蔽掉咯.废话不说了直接上代码. internal class MenuHandler : IMenuHandler { public bool ...