java8(二)方法引用
方法引用让你可以重复使用现有的方法定义,并像 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
}
参考资料
- http://how2j.cn/p/2807
- 《Java 8函数式编程》
- 《Java 8实战》
java8(二)方法引用的更多相关文章
- 30分钟入门Java8之方法引用
30分钟入门Java8之方法引用 前言 之前两篇文章分别介绍了Java8的lambda表达式和默认方法和静态接口方法.今天我们继续学习Java8的新语言特性--方法引用(Method Referenc ...
- Java8之方法引用
一.概述 在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法.然而,有时候我们仅仅是调用了一个已存在的方法.如下: Arrays.sort(stringsArray,(s1,s ...
- java8,方法引用
1:方法引用,https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html 当我们使用lambda表达式去创建一个 ...
- 使用java8的方法引用替换硬编码
背景 想必大家在项目中都有遇到把一个列表的多个字段累加求和的情况,也就是一个列表的总计.有的童鞋问,这个不是给前端做的吗?后端不是只需要把列表返回就行了嘛...没错,我也是这样想的,但是在一场和前端的 ...
- java8 lambda方法引用
注意引用方法的参数列表与返回值类型要与函数式接口中的抽象方法的参数列表与返回值类型保持一致 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实例方法名 pub ...
- java_方法引用
什么是方法引用? 个人简述方法引用: 方法引用主要是针对已经有的方法来让目前的编程更加简洁 当我们想要使用一个接口的子类的时候,子类需要重写这个接口中的抽象方法, 被重写的这个方法参数列表固定,返回值 ...
- Java8新特性之二:方法引用
上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...
- [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口
函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...
- JAVA8之Lambda表达式与方法引用表达式
一.Lambda表达式 基本语法: lambdaParameters->lambdaBody lambdaParameters传递参数,lambdaBody用于编写逻辑,lambda表达式会生成 ...
随机推荐
- SQL Server 2016 + AlwaysOn 无域集群
目录 AlwaysOn 搭建 WSFC 配置计算机的 DNS 后缀 安装故障转移集群 验证集群 创建集群 创建文件共享见证 配置 AlwaysOn 新建可用性组 创建侦听器 可读副本的负载均衡 主角色 ...
- Azkaban Condition Flow (条件工作流) 使用简介
本文上接<Azkaban Flow 2.0 使用简介>,对Azkaban Condition Flow (条件工作流) 做简单介绍 目录 目录 条件工作流 介绍 作用 使用方式 支持的运算 ...
- Java 读取PDF中的文本和图片
本文将介绍通过Java程序来读取PDF文档中的文本和图片的方法.分别调用方法extractText()和extractImages()来读取. 使用工具:Free Spire.PDF for Ja ...
- Java操作文件
import java.io.File; import java.io.IOException; import java.nio.file.*; import java.nio.file.attrib ...
- 【POJ - 1995】Raising Modulo Numbers(快速幂)
-->Raising Modulo Numbers Descriptions: 题目一大堆,真没什么用,大致题意 Z M H A1 B1 A2 B2 A3 B3 ......... AH ...
- 入职两个月,WPF开发感想
1 .新工作,新开始 2.WPF初次接触以及学习MVVM开发模式 3.后台数据操作,ORACLE 存储过程(边做边学) 4.总结 4.1工作开发中的小问题 ,遇到的坑: 4.2 解决的问题,学校到的 ...
- .NET Core CSharp初级篇 1-5 接口、枚举、抽象
.NET Core CSharp初级篇 1-5 本节内容类的接口.枚举.抽象 简介 问题 如果你需要表示星期或者是某些状态,使用字符串或者数字是否不直观? 你是否发现,无论何种电脑,它的USB口的设计 ...
- mysql8.0忘记密码如何操作?
很不幸,刚安装了MYSQL8,由于密码验证方式的不同,自己折腾了一小会,不小心退出来了,进不去了.从网上面查了一下资料,好多都不是特别好使,最后摸索出来可以进行如下操作: 1. 在配置文件中设置将密码 ...
- Maven国内镜像 Maven阿里云镜像
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name&g ...
- Prometheus 整合 AlertManager
简介 Alertmanager 主要用于接收 Prometheus 发送的告警信息,它很容易做到告警信息的去重,降噪,分组,策略路由,是一款前卫的告警通知系统.它支持丰富的告警通知渠道,可以将告警信息 ...