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的一 ...
随机推荐
- Debian/ubuntu系统的开机自启动服务的设置——update-rc.d: error: XXX Default-Start contains no runlevels, aborting.
最近把自己的树莓派搞了起来,搭了个上网的共享热点,但是遇到了开机自启动的设置问题. 我们先给出正常的ubuntu系统的开机自启动服务的设置: 在 /etc/init.d/ 路径下面创建自启动的shel ...
- conda 安装pytorch
配置:win 10 ,python=3.6 安装pytorch-1.1.0,cudatoolkit-9.0,torchvision-0.3.0. 出现的问题:import torch 的时候,出现了O ...
- 疫情远程办公Citrix XenDesktop 2203长期稳定版本虚拟云桌面部署教程
下面列出来的是目录大纲,里面包含了Citrix完整搭建的教程,此次实验环境是利用Citrix XenDesktop 7.15 CU3长期稳定版虚拟桌面详细安装教程, 含PVS及UPM相关配置,期待视频 ...
- 最新AI生成视频工具!效果不输快手可灵,CogVideoX下载介绍
要说AI生成视频最火的项目,当属国产的快手可灵了,甚至比OpenAI的Sora还要火,前者还是个ppt,可灵已经在落地公测了,博主在前段时间申请试用通道的时候,竟然排到几十万人开外的位置,好在最后还是 ...
- idea启动项目发现端口被占用!!!导致启动不起来
windows端口被占用 netstat -ano |findstr 端口号 任务管理器详细信息 PID排序找到刚才查到的 右键结束 原因: idea被异常终止导致tomcat没死
- Ruby 学习笔记
基本语法 变量 name = "Alice" age = 30 puts "Name: #{name}, Age: #{age}" var # 局部变量 @va ...
- 【openGauss】运维常用的SQL
一.查模式 SELECT pn.oid AS schema_oid, iss.catalog_name, iss.schema_owner, iss.schema_name FROM informat ...
- c# RSA加密解密,与java代码互通问题
RSA加密解密原本是公开算法,但是和一个java的小伙伴对接却出现了点问题,现在记录一下 首先,RSA的公钥私钥,有2种: 1.pem格式. 2.xml格式. 文章底部有pem格式和对应的xml样本数 ...
- 安装Kubernetes(k8s)保姆级教程---无坑版
一.安装环境说明 硬件要求 内存:2GB或更多RAM CPU: 2核CPU或更多CPU 硬盘: 30GB或更多 本次环境说明: 操作系统:CentOS 7.9 内核版本:3.10.0-1160 mas ...
- WebGL 及其在 WebRTC 中的应用
一.前言 1.什么是 WebGL ? WebGL 的全称是 Web Graphics Library,是一种 3D 绘图协议. WebGL 允许把 JavaScript 和 OpenGL ES 2.0 ...