关于Java你不知道的那些事之Java8新特性[方法引用与构造器引用]

举报
轻狂书生FS 发表于 2020/12/02 23:03:57 2020/12/02
【摘要】 方法引用与构造器引用 前言方法引用概念格式注意对象::实例方法名类::静态方法名类::实例方法名 构造器引用格式注意代码 数组引用格式 总结 前言 Java8里面方法应用和构造器引用的写法变得更加简单美观,但是带来的是可读性的下降,我个人认为目前对这方面的知识作为了解内容就可以了,知道有这么一种写法。在实际的工作中最重要的不是你用了对新...

前言

Java8里面方法应用和构造器引用的写法变得更加简单美观,但是带来的是可读性的下降,我个人认为目前对这方面的知识作为了解内容就可以了,知道有这么一种写法。在实际的工作中最重要的不是你用了对新的代码写法,而是要写别人看的懂的代码。因为在实际的开发的工作中大部分时间都是阅读别人的代码。

方法引用

概念

若Lambda体中的内容有方法已经实现了,我们可以使用“方法引用”,可以理解为方法引用是Lambda表达式的另外一种表现形式

格式

  • 对象::实例方法名
  • 类::静态方法名
  • 类::实例方法名

注意

  • Lambda体中,调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致。
  • 若Lambda参数列表中,第一个参数是实例方法的调用者,第二个参数是实例方法的参数时,可以使用ClassName::method

对象::实例方法名

 /** * 格式: 对象::实例方法名 */ public static void test() { Consumer<String> consumer = (x) -> System.out.println(x); // 使用方法引用完成(也就是上述的方法体中,已经有Lambda实现了,那就可以用方法引用的方式实现) // 同时使用方法引用的时候,需要保证:参数列表和返回值类型相同 PrintStream ps = System.out; Consumer<String> consumer2 = ps::println; } /** * 格式: 对象::实例方法名 */ public static void test2() { Employee employee = new Employee("张三", 12, 5555); Supplier<String> supplier = () -> employee.getName(); System.out.println(supplier.get()); // 使用方法引用 Supplier<String> supplier1 = employee::getName; System.out.println(supplier1.get()); }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

类::静态方法名

/**
 * 类::静态方法名
 */
public static void test3() { Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y); // 使用方法引用 Comparator<Integer> comparator2 = Integer::compare;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

类::实例方法名

 /** * 类::实例方法名 */ public static void test4() { // 比较 BiPredicate<String, String> bp = (x, y) -> x.equals(y); System.out.println(bp.test("abc", "abc")); // 使用方法引用 BiPredicate<String, String> bp2 = String::equals; System.out.println(bp2.test("abc", "abc")); }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

构造器引用

格式

  • ClassName::new

注意

需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致

代码

 /** * 构造器引用 */ public static void test() { Supplier<Employee> supplier = () -> new Employee("张三", 18, 13); // 构造器引用(调用的无参构造器) Supplier<Employee> supplier1 = Employee::new; Employee employee = supplier1.get(); // 构造器引用(调用有参构造器,一个参数的) Function<Integer, Employee> function = Employee::new; Employee employee1 = function.apply(10); System.out.println(employee1.getAge()); }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

数组引用

格式

  • Type::new
 public static void test() { Function<Integer, String[]> function = (x) -> new String[x]; function.apply(20); // 数组引用 Function<Integer, String[]> function1 = String[]::new; String[] strArray = function1.apply(20); System.out.println(strArray.length); }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

总结

一键三连(点赞、关注+收藏),不迷路,谢谢。

文章来源: blog.csdn.net,作者:轻狂书生FS,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/LookForDream_/article/details/109174266

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。