Java新特性--方法引用
常见方法引用
方法引用可以让你重复使用现有的方法定义,并像Lambda一样传递它们。
方法引用可以看做是仅仅调用特定方法的Lambda表达式的一种便捷写法。类似于Lambda表达式,方法引用不能独立存在,总是会转换为函数式接口的实例。
需要使用方法引用时,用::操作符分隔对象(或类名)和方法名,目标引用放在分隔符::前面,方法名放在::后面。
注意,只需要方法名,不需要小括号。
主要有三种情况:
对象::实例方法
Class::静态方法
Class::实例方法
指向静态方法的方法引用
Lambda表达式:(args) -> ClassName.staticMethod(args)
方法引用:ClassName::staticMethod
实例一:
@Test
public void test02(){
Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);
System.out.println(com1.compare(1, 2)); Comparator<Integer> com2 = Integer::compare;
System.out.println(com2.compare(2, 1));
}
示例二:
Integer[] data = {21,90,34,76};
Arrays.sort(data, Integer::compare);//引用静态方法
System.out.println(Arrays.toString(data));
其中Arrays.sort方法解释
static <T> void sort(T[] a, Comparator<? super T> c)
根据指定的比较器引发的顺序对指定的对象数组进行排序。
指向任意类型的实例方法的引用
Lambda表达式:
(args0, args1) -> args0.instanceMethod(args1)
args0是ClassName类型的一个对象
方法引用:ClassName::instanceMethod
Lambda 参数列表中的第一个参数是方法的调用者,第二个参数是方法的参数时(或不存在时,例如调用JavaBean的get()方法),才能使用 ClassName :: Method
示例一:
@Test
public void test03(){
BiPredicate<String, String> bp1 = (x, y) -> x.equals(y);
System.out.println(bp1.test("a","b")); BiPredicate<String, String> bp2 = String::equals;
System.out.println(bp2.test("c","c"));
}
其中Predicate的test方法解释
boolean test(T t, U u)
根据给定的参数来评估这个谓词。
实例二:
List<String> list = Arrays.asList("ccc", "bbb", "aaa");
list.sort(String::compareTo);//引用实例方法
System.out.println(list);
其中list.sort方法解释:
default void sort(Comparator<? super E> c)
使用随附的 Comparator排序此列表来比较元素。
指向现有对象的实例方法的引用
Lambda表达式:(args) -> obj.instanceMethod(args)
方法引用:obj::instanceMethod
示例一:
@Test
public void test01(){
PrintStream ps = System.out;
Consumer<String> con1 = (s) -> ps.println(s);
con1.accept("aaa"); Consumer<String> con2 = ps::println;
con2.accept("bbb");
}
示例二:
list.forEach(System.out::println);
构造方法引用
对于一个现有的构造方法,可以使用类名和关键字new来创建一个构造方法的引用:ClassName::new
package com.wangbo.cto.lambda; import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier; /**
* @date 2019/11/14 23:08
* @auther wangbo
*/
public class Test1 {
public static void main(String[] args) { //引用无参数构造方法
Supplier<Person> supplier = Person::new;
Person p1 = supplier.get();
System.out.println(p1); //引用有一个参数构造方法
Function<String, Person> function = Person::new;
Person p2 = function.apply("wangbo");
System.out.println(p2); //应用有两个参数的构造方法
BiFunction<String, Integer, Person> biFunction = Person::new;
Person p3 = biFunction.apply("wangbo", 28);
System.out.println(p3); //如果引用有三个参数及三个以上参数的构造方法,需要自定义匹配的函数式接口
TriFunction<String, Integer, String, Person> triFunction = Person::new;
Person p4 = triFunction.myMethod("zhangsan", 90, "男");
System.out.println(p4);
}
}
/**
* 自定义函数式接口
*/
@FunctionalInterface
public interface TriFunction<T, U, V, R>{
R myMethod(T t, U u, V v);
}
public class Person{
String name;
Integer age;
String gender;
public Person(){}
public Person(String name) {
this.name = name;
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person(String name, Integer age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"name=" + name +
", age=" + age +
", gender="+ gender +
"}";
}
}
运行结果
Person{name=null, age=null, gender=null}
Person{name=wangbo, age=null, gender=null}
Person{name=wangbo, age=28, gender=null}
Person{name=zhangsan, age=90, gender=男}
Java新特性--方法引用的更多相关文章
- JAVA8新特性——方法引用
JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 在Lamda新特性的支持下,JAVA8中可以使用lamda表达式来创建匿名方法.然而,有时候我们仅仅是需要调用一个已存在的方法(如 ...
- Java 8 特性 —— 方法引用
方法引用通过方法的名字来指向一个方法.方法引用可以使语言的构造更紧凑简洁,减少冗余代码.方法引用使用一对冒号 :: .下面,我们在 Car 类中定义了 4 个方法作为例子来区分 Java 中 4 种不 ...
- java8新特性——方法引用与构造器引用
上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题.今天来简单学习一下方法引用与构造器引用. 一.方法引用 方法引用:若lambda 体中得内容已经 ...
- java8新特性-方法引用
方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用 (可以将方法引用理解为 Lambda 表达式的另外一种表现形式) 1. 对象的引用 :: 实例方法名2. 类名 :: 静 ...
- Java8 新特性 方法引用
什么是方法引用 方法引用可以被看作仅仅调用特定方法的Lamdba表达式的一种快捷方式.比如说Lamdba代表的只是直接调用这个方法,最好还是用名称来调用它,可不用用对象.方法名(),方法引用,引用 ...
- Java8新特性 - 方法引用与构造器引用
方法引用 若Lambda体中的内容有方法已经实现了,我们可以使用"方法应用",可以理解为方法引用是Lambda表达式的另外一种表现形式. 使用操作符"::"将方 ...
- Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API
新语法 方法引用Method references Lambda语法 Lambda语法在AndroidStudio中报错 Stream API 我正参加2016CSDN博客之星的比赛 希望您能投下宝贵 ...
- Hi java新特性
java新特性 1995.5.23 java语言 1996 jdk1.0 250个类在API 主要用在桌面型应用程序1997 jdk1.1 500 图形用户界面编程1998 jdk1.2 2300 J ...
- 主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙
1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...
- 主流的单元测试工具之-JAVA新特性-Annotation
1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...
随机推荐
- 9组-Alpha冲刺-6/6
一.基本情况 队名:不行就摆了吧 组长博客: https://www.cnblogs.com/Microsoft-hc/p/15546711.html 小组人数: 8 二.冲刺概况汇报 张伟鹏 过去两 ...
- 高阶函数之reduce
let arrone = [1, 2, 3, 4] let arrtwo = [{ age: 1 }, { age: 2 }, { age: 3 }] let arrthree = [[1, 2, 3 ...
- this 之谜揭底:从浅入深理解 JavaScript 中的 this 关键字(二)
前言 系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请"星标"一下,敬请关注公众号最新消息. this 之谜揭底:从浅入深理解 JavaScript 中的 this 关 ...
- Win32 GDI 在内存中绘制彩色的位图
Wind32 GDI在内存中绘制彩色位图 1创建兼容的内存DC hPicture为创建的静态文本框控件句柄 LRESULT OnPaint(HWND hWnd) { PAINTSTRUCT ps; H ...
- 我的 mac 生产力工具
应用名称 说明 安装命令 Homebrew mac 上的强大包管理器 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com ...
- sipp模拟uas发送update
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 但是fs在处理update消息时候有BUG,为了复现问题,使用sipp模拟uas,发送update并发送DTMF码. 本文档记录si ...
- AI实战 | 领克汽车线上营销助手:全面功能展示与效果分析
助手介绍 我就不自我介绍了,在我的智能体探索之旅中,很多人已经通过coze看过我的教程.今天,我专注于分享我所开发的一款助手--<领克汽车线上营销>. 他不仅仅是一个销售顾问的替身,更是一 ...
- 系统编程-文件IO-dup和dup2系统调用
在linux下,一切皆文件. 文件描述符用于操作文件. 从shell中运行一个进程,默认会有3个文件描述符存在(0.1.2):)0表示标准输入,1表示标准输出,2表示标准错误. 一个进程当前有哪些打开 ...
- c++可变模板参数
在C++中的可变模板参数使用省略号 ... 来表示一个参数包(Parameter Pack),其具体位置决定了这个包是模板参数包还是函数参数包,以及如何进行参数展开. 1. 模板参数包:c... Ar ...
- OpenCL架构
OpenCL提供了一种统一的编程接口,使得程序员可以编写一次代码,然后在多种处理器上运行. 平台模型 OpenCL平台总是包括一个宿主机(host).宿主机与OpenCL程序外部的环境交互,包括I/O ...