方法引用

使用 lambda 表达式时,如果方法中 只有一个方法的调用 话(包括构造方法),可以使用方法引用进一步简化代码, 使用操作符 ::方法名和对象或类的名字分隔 开来。

主要使用情况:

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

引用对象的实例方法

基本语法

1
对象名::方法名

使用前提

如果在重写方法时,方法体中 只有一行代码,并且该代码是 调用某对象的成员方法,并且要把重写的 抽象方法中所有的参数按照顺序传入该成员方法中,使用引用对象的实例方法

1
2
3
4
5
6
7
8
9
10
11
// 使用lambda表达式
StringBuilder sb = new StringBuilder();
authors.stream()
.map(author->author.getName())
.forEach(name->sb.append(name));

// 使用方法引用
StringBuilder sb = new StringBuilder();
authors.stream()
.map(author->author.getName())
.forEach(sb::append);

引用类的静态方法

基本语法

1
类名::方法名 

使用前提

如果在重写方法时,方法体中只有一行代码,并且该代码 调用某个类的静态方法,并且把重写的 抽象方法中所有的参数都按照顺序传入静态方法中,此时可以引用类的静态方法。如果重写的方法没有参数,调用的方法也是没有参数的也符合以上规则 ,如下所示:

1
2
3
4
5
6
7
8
9
// 使用lambda表达式
authors.stream()
.map(author->author.getAge())
.map(age->String.valueOf(age));

// 使用方法引用
authors.stream()
.map(author->author.getAge())
.map(String::valueOf);

引用类的实例方法

基本语法

1
类名::方法名

使用前提

如果在重写方法时,方法体中 只有一行代码,并且该代码 调用第一个参数的成员方法,并且把 重写的抽象方法中剩余的所有参数都按照顺序传入到该成员方法中,可以使用类的实例方法。

1
2
3
4
5
6
7
8
9
// 使用lambda表达式
subAuthorNam("Cyan",new UseString() {
public String use(String str, int start, int len) {
return str.substring(start, len);
}
})

// 使用方法引用
subAuthorNam("Cyan", String::substring);

构造器引用

如果方法中的 一行代码 是构造器的话可以使用构造器引用

基本语法

1
类名::new

使用前提

如果在重写方法时,方法体中 只有一行代码,并且该代码 调用某类的构造器方法,并且把 重写的抽象方法中所有的参数按照顺序传入构造器中,可以使用构造器引用

1
2
3
4
5
6
7
8
9
10
11
12
13
// 使用lambda表达式
authors.stream()
.map(author->author.getName())
.map(name->new StringBuilder(name))
.map(sb->sb.append("Cyan").toString())
.forEach(str->System.out.println(str));

// 使用构造器引用
authors.stream()
.map(author->author.getName())
.map(StringBuilder::new)
.map(sb->sb.append("Cyan").toString())
.forEach(str->System.out.println(str));