大家好,我是骑电动车飙车的小赢同学,一个平平无奇的程序媛。
前言
昨天才夸 Lambda 完胜 匿名类,回忆一下,胜在哪里?胜在更加简洁。今天翻脸无情,又被人比下去了。我们来一起看下方法引用是何方神圣?本篇主要以下面三点进行讨论:
-
什么是方法引用
-
如何构建方法引用
-
方法引用的优势对比
-
总结
1.什么是方法引用
方法引用 就是 让你根据已有的方法实现来创建 Lambda 表达式。可以看做调用特定方法的 Lambda 的一种快捷写法。 显示的指明方法的名称,代码的可读性会更好。
-
方法引用格式
目标引用::方法的名称 列 User::getAge
·
-
方法引用的列子
User user1 = User.of("黄小赢", 18); User user2 = User.of("美少女战士", 100); ArrayList<User> users = Lists.newArrayList(user1, user2); //lambda写法 users.sort((a, b) -> Integer.compare(a.getAge(),b.getAge())); //方法引用 users.sort(Comparator.comparingInt(User::getAge)); BiPredicate<List<String>, String> contains = (list, element) -> list.contains(element); BiPredicate<List<String>, String> contains = List::contains;方法引用 User:: getAge 等同于 User user->user.getAge();
2.如何构建方法引用
2.1指向静态方法的引用
Integer::parseInt
###2.2指向任意类型实例方法的方法引用
(String s)-> s.length(); 等价于 String::length
(String s)-> s.toUpperCase(); 等价于 String::toUpperCase
在引用一个对象的方法,这个对象本身是Lambda的一个参数
###2.3 指向现有对象的实例方法的方法引用
//user对象中有个test 方法
User user = User.of("美少女战士", 100);
users.forEach(()->user.test()); user是本来的声明好的对象
users.forEach(User::test);
在Lambda中调用一个已经存在的外部对象中的方法.
2.4 构造函数创建
#语法
className::new
//例子
BiFunction<String,Integer,User> user = User::new;
User u = user.apply("hello",18);
3.优势对比
下面以 对用户的年龄进行排序,进行演示
-
实现Comparator 接口,重写比较方法
/** * @author huang1996 * @date 2021-07-14 19:52 */ public class MethodReference implements Comparator<User> { @Override public int compare(User user1,User user2) { return Integer.compare(user1.getAge(),user2.getAge()); } } -
匿名类
Collections.sort(users, new Comparator<User>() { @Override public int compare(User o1, User o2) { return Integer.compare(o1.getAge(),o2.getAge()); } }); -
Lambda 表达式
users.sort((a, b) -> Integer.compare(a.getAge(), b.getAge())); -
方法引用
users.sort(Comparator.comparingInt(User::getAge));
4.总结
从第 3 点的优势对比中,我们很明显的看到,代码是越来越简洁,越来越清晰。方法引用的完胜点也就在这。
所以只要方法引用更加简洁,清晰就用方法引用;如果方法引用并不简洁,就坚持使用 Lambda。
阅读来源
《 Java 8 实战》第三章方法引用
《 Effective Java》第42条