概述

方法引用是用来直接访问类或实例阴茎存在的方法或者构造方法.它需要由兼容的函数式接口(lambda表达式中用到的接口)构成的目标类型上下文. 有时候, 当我们想要实现一个函数式接口的方法, 但是已经由类实现了我们想要的功能, 这时可以使用方法引用来直接使用现有的功能实现.

关于lambda表达式可以看这篇文章Java8 Lambda表达式

当lambda表达式只是执行一个方法调用时, 直接通过方法引用的形式调用. 方法引用是一种更简洁的lambda表达式.

方法引用是lambda表达式的简写, 提高了代码可读性. 可以看出来, 方法引用就是用已经实现的方法来实现lambda表达式中的实现, 所以引用的方法要满足以下要求:

  1. 引用的方法的参数列表必须与实现的抽象方法参数列表保持一致.

使用

因为方法引用是简写的lambda表达式, 所以类比即可.

方法引用的语法为:

类或对象名::方法名或new

通过引用即可引用指定类或对象的指定方法

分类

下面介绍以下几种不同的方法引用.

1.静态方法引用

顾名思义, 静态方法引用就是引用类的静态方法, 语法为:

类名::静态方法名

方法引用与lambda表达式:

String::valueOf 等价于 s -> String.valueOf(s);
Math::pow 等价于 (x,y) -> Math.pow(x,y);

2.实例方法引用

顾名思义,实例方法引用就是引用对象实例的方法, 语法为:

对象实例::方法名

方法引用与lambda表达式:

String str = "aaaaaaaaaaa";
// 若实例方法要通过对象来调用, 第一个参数会成为调用实例方法的对象, 后面的参数为调用方法的参数
String::length 等价于lambda表达式 s -> s.length();
String::equals 等价于lambda表达式 (s1,s2) -> s1.equals(s2);
// 若实例方法为this或super, 参数会成为调用方法的参数
this::equals 等价于lambda表达式 s -> this.equals(s);
super::equals 等价于lambda表达式 s -> super.equals(s);

3.构造方法引用

顾名思义, 构造方法引用就是引用类的构造方法, 语法为:

类名::new

方法引用与lambda表达式:

// 会根据参数寻找合适的构造方法
String::new 等价于lambda表达式 s->new String(s);
也等价于 ()->new String();
// 同时也可以创建数组
int[]::new 等价于lambda表达式 x->new int[x];


关于方法引用的更多可以自己进行尝试

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

  1. Java8 方法引用和构造方法引用

    如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言 ...

  2. JAVA8方法引用

    方法引用:若Lambda方法体已经实现,我们可以使用方法引用* 主要有三种语法格式:* 对象::实例方法名* 类::实例方法名* 类::静态方法名** 注意:Lambda体中调用的方法的参数列表与返回 ...

  3. Java8 方法引用与构造器引用,数组引用

    package java_8; import org.junit.Test; import java.io.PrintStream; import java.util.Comparator; impo ...

  4. Java8——方法引用

    方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式.那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用. 一.方法引用的三种语法格式 ...

  5. java8 方法引用与lambda

    List<String> list = new ArrayList<>(); //list.stream().filter((String s)->System.out. ...

  6. Java 方法引用_特性

    JAVA8 方法引用:(四种方法引用的使用) 对象引用的特点:不同的对象可以操作同一块的内容:而方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字. 引用静态方法: 类名称 :: sta ...

  7. Java笔记——Java8特性之Lambda、方法引用和Streams

    Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...

  8. 30分钟入门Java8之方法引用

    30分钟入门Java8之方法引用 前言 之前两篇文章分别介绍了Java8的lambda表达式和默认方法和静态接口方法.今天我们继续学习Java8的新语言特性--方法引用(Method Referenc ...

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

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

随机推荐

  1. 【阿里聚安全·安全周刊】Intel芯片级安全漏洞事件|macOS存在漏洞

    关键词:Intel漏洞丨mac OS漏洞丨三星漏洞丨安卓安全丨CPU漏洞丨phpMyAdmin漏洞丨iOS设备|安卓恶意软件检测|Burpsuite   本周资讯top3 [Intel漏洞]芯片级安全 ...

  2. 【转】odoo nginx 配置

    ## OpenERP backend ## upstream odoo { server 127.0.0.1:8069 weight=1 fail_timeout=0; } upstream odoo ...

  3. silverlight属性改变事件通知

    工作中遇到silverlight本身没有提供的某些属性改变事件,但又需要在属性改变时得到通知,Google搬运stack overflow,原地址 /// Listen for change of t ...

  4. AI - Tips

    01- Playground http://playground.tensorflow.org TensorFlow的网页工具Playground提供了几种简单类型的data,可以调节网络结构.学习率 ...

  5. 【shiro】(5)---基于Shiro的权限管理

    基于Shiro的权限管理项目搭建 前面写了四篇有关权限的文章,算是这篇文章的铺垫了.这篇文章采用 开发环境           JDK1.8          Eclipse          Mav ...

  6. MySQL联合索引VS单列索引

    MySQL联合索引VS单列索引 以一个一千万数据量的表格为例 1. 建表建索引 USE foo; DROP TABLE IF EXISTS tmp; CREATE TABLE tmp ( id INT ...

  7. 《HelloGitHub月刊》第 03 期

    <HelloGithub>第03期 兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个 ...

  8. 在 Windows 上可以用 Docker 吗?

    作者:陈计节 个人博客:https://blog.jijiechen.com/post/docker-on-windows/ Docker,或者准确一点说,容器技术,在近几年里几乎成为了应用分发和集群 ...

  9. C#4并行计算

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. linux:终端常用命令 + vi命令修改文件及保存 方法

    首先介绍一下Ubuntu下各个目录的一般作用: /  这就是根目录,一台电脑有且只有一个根目录,所有的文件都是从这里开始的.举个例子:当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录 ...