文章目录

方法引用的新特性

public static void main(String[] args) {
// 创建两个班级的学生集合
...
// 通过流的方式得出两个班级的超过90分的前三名学生
...
// 合并两个流对象,并进行排序输出
Stream.concat(stream1, stream2).sorted((s1,s2)->s1.compareTo(s2)).forEach(student -> System.out.println(student));

}
// 学生类
class Student implements Comparable {
...
@Override
public int compareTo(Object o) {
if (o instanceof Student){
return ((Student) o).score-this.score;
}
return -1;
}
}
  • 在JDK8中引入了“方法引用“的新特性”,可以对Lambda表达式进行简化:
Stream.concat(stream1, stream2).sorted(Student::compareTo).limit(3).forEach(student -> System.out.println(student));

即sorted((s1,s2)->s1.compareTo(s2))简写成了sorted(Student::compareTo)(双冒号::为引用运算符)。

方法引用的常用方式

使用方式

描述

对象名引用

object :: instanceMethodName

静态方法引用

ClassName :: staticMethodName

构造器引用

ClassName :: new

通过对象名引用成员方法
  • 对象名已经存在,成员方法已经存在,则可以使用对象名来引用成员方法
/**
* 通过对象名引用成员方法
*
* @author zhuhuix
* @date 20200802
*/
public class FunctionReference01 {
// 方法
public static void printString(Printable printable,String s) {
printable.print(s);
}

public static void main(String[] args) {
String string = "abcdefg";
//传统语法
// printString(s -> {
// UpperCase upperCase = new UpperCase();
// upperCase.stringUpperCase(s);
// },string);

// 创建字母大定转换的对象
UpperCase upperCase = new UpperCase();
// 通过对象名引用成员方法实现字母大写转换
printString(upperCase::stringUpperCase,string);

}
}

// 函数式接口
@FunctionalInterface
interface Printable{
void print(String s);
}

// 定义一个字母大写转换的类和大写转换的成员方法
class UpperCase {
public void stringUpperCase(String s) {
System.out.println(s.toUpperCase());
}
}

通过方法引用简化Lambda表达式_对象名

通过类名的静态成员方法
  • 类名已经存在,静态成员方法已经存在,则可以使用类名来引用静态成员方法
/**
* 通过类名引用静态成员方法
*
* @author zhuhuix
* @date 20200802
*/
public class FunctionReference02 {
// 方法
public static void printString(Printable printable,String s) {
printable.print(s);
}

public static void main(String[] args) {
String string = "abcdefg";

// 通过类名引用静态成员方法实现字母大写转换
printString(UpperCase::stringUpperCase,string);

}
}

// 函数式接口
@FunctionalInterface
interface Printable{
void print(String s);
}

// 定义一个字母大写转换的类和大写转换的成员方法
class UpperCase {
public static void stringUpperCase(String s) {
System.out.println(s.toUpperCase());
}
}

通过方法引用简化Lambda表达式_成员方法_02

构造器引用
/**
* 构造器引用
*
* @author zhuhuix
* @date 20200802
*/
public class FunctionReference03 {
// 方法
public static void build(PersonBuilder personBuilder,String name,int age) {
Person person= personBuilder.builerPerson(name,age);
System.out.println(person.toString());
}
public static void main(String[] args) {
// 构造器方法引用
build(Person::new,"Jack",16);
build(Person::new,"Mike",17);
build(Person::new,"Rose",18);
}
}

// 通过姓名与年龄创建person对象
@FunctionalInterface
interface PersonBuilder{
Person builerPerson(String name,int age);
}

class Person{
String name;
int age;

Person(){}

Person(String name,int age){
this.name=name;
this.age=age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

通过方法引用简化Lambda表达式_java_03