目录
为什么要用方法引用
Lambda表达式冗余
解决方案
方法引用的格式
对象名::方法名
类名::静态方法名
类名::引用实例方法
类名::构造器
数组::构造器
public class methodRefTest {public static void main(String[] args) {printMax(a->{// Lambda表达式中的代码和 getTotal中的代码冗余了int sum = 0;for (int i : a) {sum += i;}System.out.println("数组之和:" + sum);});}private static void printMax(Consumer consumer){int[] a= {10,20,30,40,50,60};consumer.accept(a);}/*** 求数组中的所有元素的和* @param a*/public void getTotal(int a[]){int sum = 0;for (int i : a) {sum += i;}System.out.println("数组之和:" + sum);}}
因为在Lambda表达式中要执行的代码和我们另一个方法中的代码是一样的,这时就没有必要重写一 份逻辑了,这时我们就可以“引用”重复代码
public class methodRefTest {public static void main(String[] args) {printMax(methodRefTest::getTotal);}private static void printMax(Consumer consumer){int[] a= {10,20,30,40,50,60};consumer.accept(a);}/*** 求数组中的所有元素的和* @param a*/public static void getTotal(int a[]){int sum = 0;for (int i : a) {sum += i;}System.out.println("数组之和:" + sum);}}
符号表示: ::
符号说明:双冒号为方法引用运算符,而它所在的表达式被称为 方法引用
应用场景:如果Lambda表达式所要实现的方案,已经有其他方法存在相同的方案,那么则可以使用方法引用。(注意一个小细节,方法引用的时候方法没有括号哦)
常见的引用方式:
public static void main(String[] args) {Date now = new Date();Supplier supplier1 = ()->{return now.getTime();};System.out.println(supplier1.get());// 然后我们通过 方法引用 的方式来处理Supplier supplier2 = now::getTime;System.out.println(supplier2.get());}
方法引用的注意事项:
public class FunctionRefTest04 {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 class FunctionRefTest05 {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);}
}
public class FunctionRefTest06 {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) {Function fun1 = (len)->{return new String[len];};String[] a1 = fun1.apply(3);System.out.println("数组的长度是:" + a1.length);// 方法引用 的方式来调用数组的构造器Function fun2 = String[]::new;String[] a2 = fun2.apply(5);System.out.println("数组的长度是:" + a2.length);
}
上一篇:德国杯-勒沃库森3-2斯图加特晋级四强 塔头槌绝杀维尔茨两助攻 德国杯-勒沃库森3-2斯图加特晋级四强 塔头槌绝杀维尔茨两助攻
下一篇:突然断电!韩国队本届亚洲杯场均射正6次,但对阵约旦0射正 突然断电!韩国队本届亚洲杯场均射正6次,但对阵约旦0射正