方法引用让你可以重复使用现有的方法定义,并像 Lambda 一样进行传递。

方法引用可以被看作仅仅调用特定方法的 Lambda 的一种快捷写法。

事实上,方法引用就是让你根据已有的方法实现来创建 Lambda 表达式。

例:

@Test
public void test1() {
Chat chat = (content) -> System.out.println(content);
chat.say("hello!");
} @Test
public void test2() {
Chat chat = System.out::println;
chat.say("hello!");
} interface Chat {
void say(String word);
}

test1是 Lambda 表达式写法,通过调用 println 方法输出 content。test2 是方法引用,这里看起来方法引用更加的简洁明了。看完例子,再来看看语法。

语法

这里把方法引用分为5种

1.静态方法引用:ClassName::staticMethod

2.特定类的任意对象的方法引用:ClassName::instanceMethod

3.特定对象的方法引用:instance::instanceMethod

4.构造器引用:ClassName::new

5.数组引用:ClassName[]::new

举例

语法没看懂,没关系,我们举例来说明-_-

1.静态方法引用

@Test
public void test3() {
// Function<T,R> 接受一个输入参数,返回一个结果。(java8定义的函数式接口)
Function<Integer, String> f1 = (s) -> String.valueOf(s); // 将传入的类型转换成String
System.out.println(f1.apply(100) + 200); // 输出100200 Function<Integer, String> f2 = String::valueOf; // 将传入的类型转换成String
System.out.println(f2.apply(100) + 200); // 输出100200
}

2.特定类的任意对象的方法引用

@Test
public void test4() {
// Function<T,R> 接受一个输入参数,返回一个结果。(java8定义的函数式接口)
Function<String, Integer> f1 = (s) -> s.length(); // 返回字符串长度
System.out.println(f1.apply("hello")); // 输出5 Function<String, Integer> f2 = String::length; // 返回字符串长度
System.out.println(f2.apply("hello")); // 输出5
}

3.特定对象的方法引用

@Test
public void test5() {
String s = "hello";
// IntSupplier 无参数,返回一个int类型结果。(java8定义的函数式接口)
IntSupplier intSupplier1 = () -> s.length(); // 返回字符串长度
System.out.println(intSupplier1.getAsInt()); // 输出5 IntSupplier intSupplier2 = s::length; // 返回字符串长度
System.out.println(intSupplier2.getAsInt()); // 输出5
}

4.构造器引用

@Test
public void test6() {
// Supplier<T> 无参数,返回一个结果。(java8定义的函数式接口)
List list1 = this.getList(() -> new ArrayList()); List list2 = this.getList(ArrayList::new);
} public static List getList(Supplier<List> s){
return s.get();
}

5.数组引用

@Test
public void test7() {
// Function<T,R> 接受一个输入参数,返回一个结果。(java8定义的函数式接口)
Function<Integer, String[]> f1 = length -> new String[length];
String[] strs = f1.apply(10);
System.out.println(strs.length); // 输出10 Function<Integer,String[]> f2 = String[]::new;
strs = f2.apply(10);
System.out.println(strs.length); // 输出10
}

参考资料

  1. http://how2j.cn/p/2807
  2. 《Java 8函数式编程》
  3. 《Java 8实战》

java8(二)方法引用的更多相关文章

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

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

  2. Java8之方法引用

    一.概述 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法.然而,有时候我们仅仅是调用了一个已存在的方法.如下: Arrays.sort(stringsArray,(s1,s ...

  3. java8,方法引用

    1:方法引用,https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html 当我们使用lambda表达式去创建一个 ...

  4. 使用java8的方法引用替换硬编码

    背景 想必大家在项目中都有遇到把一个列表的多个字段累加求和的情况,也就是一个列表的总计.有的童鞋问,这个不是给前端做的吗?后端不是只需要把列表返回就行了嘛...没错,我也是这样想的,但是在一场和前端的 ...

  5. java8 lambda方法引用

    注意引用方法的参数列表与返回值类型要与函数式接口中的抽象方法的参数列表与返回值类型保持一致 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实例方法名 pub ...

  6. java_方法引用

    什么是方法引用? 个人简述方法引用: 方法引用主要是针对已经有的方法来让目前的编程更加简洁 当我们想要使用一个接口的子类的时候,子类需要重写这个接口中的抽象方法, 被重写的这个方法参数列表固定,返回值 ...

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

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

  8. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  9. JAVA8之Lambda表达式与方法引用表达式

    一.Lambda表达式 基本语法: lambdaParameters->lambdaBody lambdaParameters传递参数,lambdaBody用于编写逻辑,lambda表达式会生成 ...

随机推荐

  1. scrapy基础知识之防止爬虫被反的几个策略::

    动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息) 禁用Cookies(也就是不启用cookies middleware,不向Server发送cookies,有些网 ...

  2. Markdown下,上传图片问题

    最简单的方法: 1,登录qq 2,登录博客园,并打开博客园添加随笔的地方:如图: 3,选择需要截屏的地方,按住ctrl+alt+A截屏,然后在qq的发送栏内贴过去 4,鼠标左键按住不松开,然后拖到这里 ...

  3. 新手上路——it人如何保持竞争力

    新手上路——如何保持竞争力 JINGZHENGLI 套用葛大爷的一句名言:21世纪什么最贵,人才.哪你是人才还是人材?还是人财或人裁?相信大家都不是最后一种.何如保持住这个光环呢?就需要我们保持我们独 ...

  4. python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下(详解)

    简介 发邮件前我们需要了解的是邮件是怎么一个形式去发送到对方手上的,通俗点来说就是你写好一封信,然后装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去,其他的就不关心了,只是关心时间,而电子邮 ...

  5. Centos7 安装jdk,MySQL

    报名立减200元.暑假直降6888. 邀请链接:http://www.jnshu.com/login/1/20535344 邀请码:20535344 学习阿里云平台的云服务器配置Java开发环境.我现 ...

  6. 异常:带有 CLSID {} 的 COM 对象无效或未注册

    今天处理调试打印程序的时候,看到这个异常: 代码: try { string strApplyEmpno=""; string strApplyDeptCode="&qu ...

  7. Python解释器安装教程以及环境变量配置 以及 pycharm的安装与激活

    计算机的组成 主板:人的骨架,用于拓展设备 CPU:人的大脑,用于计算和逻辑处理 硬盘:存储数据(永久储存),比如电脑上的 C盘,D盘 内存:临时记忆(断电即消失) 操作系统:XP win7 win1 ...

  8. Docker+Maven+Jenkins在Devops中完整应用

    过去与现在 很早之前,当我们需要一个部署环境的时候,我们可能指的是一台PowerEdge R710 2U服务器,走一系列冗长的申请流程,然后上架到机房.调试网络.安装系统.调试环境.最终部署应用,就这 ...

  9. UVA816 Abbott的复仇 Abbott's Revenge

    以此纪念一道用四天时间完结的题 敲了好几次代码的出错点:(以下均为正确做法) memset初始化 真正的出发位置必须找出. 转换东西南北的数组要从0开始. bfs没有初始化第一个d 是否到达要在刚刚取 ...

  10. JS浅学

    (变量的名字.focus(); )让打开的新的页面获取焦点 (变量的名字.close();)关闭打开的页面 可以用(!变量名)直接判断是否打开过新的页面 用(变量名.closed)判断是不是被关闭了 ...