java8函数式编程学习(六)- 方法引用

6. 方法引用

我们在使用lambda时,如果方法体中只有一个方法的调用(包括构造方法),我们就可以使用方法引用进一步简化代码

6.1 推荐用法

我们在使用lambda时,不需要考虑什么时候用方法引用,用那种法法引用,格式是什么。
我们只需要在写完lambda方法发现方法体只有一行代码,并且是方法的调用时使用快捷键尝试是否能够转换成方法引用即可。
当我们方法引用使用多了慢慢的也可以直接写出方法引用

6.2 基本格式

类或对象名::方法名

6.3 语法详解

6.3.1 引用类的静态方法

格式 类名::方法名
使用前提:如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个类的静态方法,并且我们要把重写的抽象方法中所有的参数都按照顺序传入这个静态方法中,这个时候我们就可以引用类的静态方法。

List<Author> authors = StreamDemo.getAuthors();
authors.stream()
    .map(author -> author.getAge())
    //.map(obj -> String.valueOf(obj)) //(优化前)
    .map(String::valueOf) // 类的静态方法(优化后)
    .forEach(System.out::println); // 类的静态方法

6.3.2 引用对象的实例方法

格式 对象名::方法名
使用前提:如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个对象的成员方法,并且我们要把重写的抽象方法中所有的参数都按照顺序传入这个成员方法中,这个时候我们就可以引用对象的实例方法。

List<Author> authors = StreamDemo.getAuthors();
StringBuilder sb = new StringBuilder();
authors.stream()
    .map(author -> author.getName())
    //.forEach(name -> stringBuilder.append(name)); //(优化前)
    .forEach(sb::append); // 对象的实例方法(优化后)

6.3.3 引用类的实例方法

格式 类名::方法名
使用前提:如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了第一个参数的成员方法,并且我们要把重写的抽象方法中剩余的所有的参数都按照顺序传入这个静态方法中,这个时候我们就可以引用类的实例方法。

List<Author> authors = StreamDemo.getAuthors();
subAuthorName("测试测试", new UseString() {
            @Override
            public String use(String str, int start, int length) {
                return str.substring(start, length);
            }
        });
// 优化后
subAuthorName("测试测试", String::substring);
interface UseString {
    String use(String str, int start, int length);
}

public static String subAuthorName(String str, UseString useString) {
    int start = 0;
    int length = 1;
    return useString.use(str, start, length);
}

6.3.4 构造器引用

格式 类名::new
使用前提:如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个类的构造方法,并且我们要把重写的抽象方法中所有的参数都按照顺序传入这个静态方法中,这个时候我们就可以引用构造器方法。

List<Author> authors = StreamDemo.getAuthors();
authors.stream()
    .map(Author::getName)
    //.map(name -> new StringBuilder(name)) //(优化前)
    .map(StringBuilder::new) // 构造器引用(优化后)
    .map(strBuilder -> strBuilder.append("拼接一下").toString())
    .forEach(System.out::println);
posted @ 2022-03-30 10:38  xiexie0812  阅读(75)  评论(0编辑  收藏  举报