简介
方法引用是java8的新特性之一, 可以直接引用已有Java类或对象的方法或构造器。方法引用与lambda表达式结合使用,可以进一步简化代码。
方法引用的使用场景
我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况下,我们倾向于通过方法名来调用它,而Lambda表达式可以帮助我们实现这一要求,它使得Lambda在调用那些已经拥有方法名的方法的代码更简洁、更容易理解。方法引用可以理解为Lambda表达式的另外一种表现形式。
方法引用的分类
类型 | 语法 | 对应的Lambda表达式 |
---|---|---|
静态方法引用 | 类名::staticMethod | (args) -> 类名.staticMethod(args) |
实例方法引用 | inst::instMethod | (args) -> inst.instMethod(args) |
对象方法引用 | 类名::instMethod | (inst,args) -> 类名.instMethod(args) |
构建方法引用 | 类名::new | (args) -> new 类名(args) |
示例代码:
import lombok.AllArgsConstructor; import lombok.Data; /** * create gl **/ @Data @AllArgsConstructor public class User { private String name; private Integer age; private String sex; private Status status; public User(String name){ this.name=name; } public User(){} public User(String name, Integer age, String sex) { this.name = name; this.age = age; this.sex = sex; } public enum Status{ FREE, BUSY, VOCATION; } } import com.gl.java8test.User; import java.util.Comparator; import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; /** * create gl * * 一。方法引用:若lambda 体中的内容 有方法已经实现,我们可以使用”方法引用“ * * 主要有三种语法格式 * * 1. 对象 :: 实例方法名 * 2. 类 :: 静态方法名 * 3. 类 :: 实例方法名 * * 注意:方法体中的参数与返回类型 必须与该函数接口中的参数返回类型保持一致 * 第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写 ClassName::method * * * 二。 构造器引用 * 格式: ClassName::new * * 三. 数组引用 * 格式: Type[]::new **/ public class Test03 { //对象 :: 实例方法名 public static void test1(){ Consumer<String> consumer = System.out::println; consumer.accept("631235"); System.out.println("----------------------------"); User user=new User(); Supplier<String> stringSupplier = user::getName; stringSupplier.get(); } //类 :: 静态方法名 public static void test2(){ Comparator<Integer> comparator = Integer::compare; } //类 :: 实例方法名 public static void test3(){ BiPredicate biP = (x,y) -> x.equals(y); // 下面这样写必须是 : 第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写 ClassName::method BiPredicate<String,String> biPredicate=String::equals; } //构造器引用 构造器的参数与返回类型 必须与该函数接口中的参数返回类型保持一致 public static void test4(){ // Supplier<User> userSupplier = () -> new User(); Supplier<User> userSupplier=User::new; User user = userSupplier.get(); System.out.println("----------------------------"); Function<String,User> function = User::new; User user1 = function.apply("sfsdf"); System.out.println(user1); } //数组引用 public static void test5(){ // Function<Integer,String[]> function = x -> new String[x]; Function<Integer,String[]> function = String[]::new; } public static void main(String[] args) { // test1(); test4(); } }
import com.gl.java8test.User; import java.util.Comparator; import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; /** * create gl * * 一。方法引用:若lambda 体中的内容 有方法已经实现,我们可以使用”方法引用“ * * 主要有三种语法格式 * * 1. 对象 :: 实例方法名 * 2. 类 :: 静态方法名 * 3. 类 :: 实例方法名 * * 注意:方法体中的参数与返回类型 必须与该函数接口中的参数返回类型保持一致 * 第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写 ClassName::method * * * 二。 构造器引用 * 格式: ClassName::new * * 三. 数组引用 * 格式: Type[]::new **/ public class Test03 { //对象 :: 实例方法名 public static void test1(){ Consumer<String> consumer = System.out::println; consumer.accept("631235"); System.out.println("----------------------------"); User user=new User(); Supplier<String> stringSupplier = user::getName; stringSupplier.get(); } //类 :: 静态方法名 public static void test2(){ Comparator<Integer> comparator = Integer::compare; } //类 :: 实例方法名 public static void test3(){ BiPredicate biP = (x,y) -> x.equals(y); // 下面这样写必须是 : 第一个参数是实例的调用者,第二个参数是实例方法的参数时,可以这样写 ClassName::method BiPredicate<String,String> biPredicate=String::equals; } //构造器引用 构造器的参数与返回类型 必须与该函数接口中的参数返回类型保持一致 public static void test4(){ // Supplier<User> userSupplier = () -> new User(); Supplier<User> userSupplier=User::new; User user = userSupplier.get(); System.out.println("----------------------------"); Function<String,User> function = User::new; User user1 = function.apply("sfsdf"); System.out.println(user1); } //数组引用 public static void test5(){ // Function<Integer,String[]> function = x -> new String[x]; Function<Integer,String[]> function = String[]::new; } public static void main(String[] args) { // test1(); test4(); } }
总结
到此这篇关于java8新特性之方法引用的文章就介绍到这了,更多相关java8新特性方法引用内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍Java8新特性之方法引用的实践指南,包括了Java8新特性之方法引用的实践指南的使用技巧和注意事项,需要的朋友参考一下 一 前言 日常开发中,经常使用到Lambda表达式,例如: 其中(x) -> System.out.println(x)就是使用的Lambda表达式。Lambda表达式可以分为三部分: 左括号:Lambda的形参列表,对应接口的抽象方法的形参列表。 箭头:Lamb
我正在通过一个例子,它从与方法引用相关的当前目录中提取一个隐藏文件数组,如下所述 使用匿名内部类实现 使用方法参考实现 我的问题是接口只有一个抽象方法(),而实现accept-method-using-method-reference在类中使用的有效性如何。我了解到,只有当参数与抽象方法匹配时,我们才能应用方法引用,但是这里method有一个类型的参数,但是没有参数。你能解释一下它的有效性吗。
本文向大家介绍Java8新特性之默认方法(default)浅析,包括了Java8新特性之默认方法(default)浅析的使用技巧和注意事项,需要的朋友参考一下 一、什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,
主要内容:1 Java8 方法引用的介绍,2 Java8 方法引用的分类,3 Java8 方法引用:引用静态方法,4 Java8 方法引用:引用实例方法,5 Java8 方法引用:引用构造方法1 Java8 方法引用的介绍 Java提供了一个新功能,称为Java 8中的方法引用。方法引用用于引用功能接口的方法。它是lambda表达式的紧凑和简单形式。每次使用lambda表达式仅引用方法时,都可以将lambda表达式替换为方法引用。在本教程中,我们将详细解释方法参考概念。 2 Java8 方法引用
本文向大家介绍Java8新特性Stream流实例详解,包括了Java8新特性Stream流实例详解的使用技巧和注意事项,需要的朋友参考一下 什么是Stream流? Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。 Stream的优点:声明性,可复合,可并行。这三个特性使得stream操作更简洁,更灵活,更高效。 Stream的操作有两个特点:可以多个操作链接起来运行,内部
本文向大家介绍ThinkPHP3.1新特性之G方法的使用,包括了ThinkPHP3.1新特性之G方法的使用的使用技巧和注意事项,需要的朋友参考一下 长期以来ThinkPHP都是需要通过debug_start、debug_end方法甚至Debug类才能完成那些调试的功能,而在ThinkPHP3.1版本中,这些复杂的功能被一个简单的G方法取代了,这不可不谓是一次华丽升级。 G方法的作用包括标记位置和区