第43条:方法引用优于Lambda

574 阅读2分钟

大家好,我是骑电动车飙车的小赢同学,一个平平无奇的程序媛。

前言

​ 昨天才夸 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.优势对比

下面以 对用户的年龄进行排序,进行演示

  1. 实现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());
        }
    }
    
  2. 匿名类

       Collections.sort(users, new Comparator<User>() {
                @Override
                public int compare(User o1, User o2) {
                    return Integer.compare(o1.getAge(),o2.getAge());
                }
            });
    
  3. Lambda 表达式

     users.sort((a, b) -> Integer.compare(a.getAge(), b.getAge()));
    
    
  4. 方法引用

    users.sort(Comparator.comparingInt(User::getAge));
    

4.总结

从第 3 点的优势对比中,我们很明显的看到,代码是越来越简洁,越来越清晰。方法引用的完胜点也就在这。

所以只要方法引用更加简洁,清晰就用方法引用;如果方法引用并不简洁,就坚持使用 Lambda。

阅读来源

《 Java 8 实战》第三章方法引用

《 Effective Java》第42条