在使用Lambda表达式的时候,也会出现代码冗余的情况,比如:用Lambda表达式求一个数组的和
public static void main(String[] args) {
printSum(a -> {
// Lambda表达式中的代码和 getTotal中的代码冗余了
int sum = 0;
for (int i : a) {
sum += i;
}
System.out.println("数组之和:" + sum);
});
}
public static void getTotal(int[] a) {
int sum = 0;
for (int i : a) {
sum += i;
}
System.out.println("数组之和:" + sum);
}
private static void printSum(Consumer consumer) {
int[] a = {10, 20, 30, 40, 50, 60};
consumer.accept(a);
}
因为在Lambda表达式中要执行的代码和我们另一个方法中的代码是一样的,这时就没有必要重写一份逻辑了,这时我们就可以“引用”重复代码
public static void main(String[] args) {
printSum(a -> {
printSum(Main::getTotal);
});
}
public static void getTotal(int[] a) {
int sum = 0;
for (int i : a) {
sum += i;
}
System.out.println("数组之和:" + sum);
}
private static void printSum(Consumer consumer) {
int[] a = {10, 20, 30, 40, 50, 60};
consumer.accept(a);
}
二、方法引用的五种方式
①、对象名::方法名
这是最常见的一种用法。如果一个类中的已经存在了一个成员方法,则可以通过对象名引用成员方法
public static void main(String[] args) {
Date now = new Date();
Supplier supplier = () -> {
return now.getTime();
};
System.out.println(supplier.get());
// 然后我们通过 方法引用 的方式来处理
Supplier supplier1 = now::getTime;
System.out.println(supplier1.get());
}
②、类名::静态方法名
public static void main(String[] args) {
Supplier supplier1 = ()->{
return System.currentTimeMillis();
};
System.out.println(supplier1.get());
// 通过 方法引用 来实现
Supplier supplier2 = System::currentTimeMillis;
System.out.println(supplier2.get());
}
③、类名::引用实例方法
Java面向对象中,类名只能调用静态方法,类名引用实例方法是用前提的,实际上是拿第一个参数作 为方法的调用者
public static void main(String[] args) {
Function function = (s) -> {
return s.length();
};
System.out.println(function.apply("hello"));
// 通过方法引用来实现
Function function1 = String::length;
System.out.println(function1.apply("hahahaha"));
BiFunction function2 = String::substring;
String msg = function2.apply("HelloWorld", 3);
System.out.println(msg);
}
④、类名::构造器
Java面向对象中,类名只能调用静态方法,类名引用实例方法是用前提的,实际上是拿第一个参数作 为方法的调用者
public static void main(String[] args) {
Supplier sup = ()->{return new Person();};
System.out.println(sup.get());
// 然后通过 方法引用来实现
Supplier sup1 = Person::new;
System.out.println(sup1.get());
BiFunction function = Person::new;
System.out.println(function.apply("张三",22));
}
⑤、数组::构造器
public static void main(String[] args) {
Supplier sup = () -> {
return new Person();
};
System.out.println(sup.get());
// 然后通过 方法引用来实现
Supplier sup1 = Person::new;
System.out.println(sup1.get());
BiFunction function = Person::new;
System.out.println(function.apply("张三", 22));
}



