Lambda表达式系列:
Java8 lambda表达式及自定义函数式接口入门
玩转java8 Lambda表达式一


什么是办法援用?
Lambda还有一个十分重要的性能,就是办法援用。办法援用能够了解为lambda表达式的简便写法。办法援用是用来间接拜访类或者实例的曾经存在的办法或构造方法(函数),它比lambda表达式更加的简洁,更高的可读性,更好的复用性。


办法援用的语法

类名(或实例)::办法名

办法援用的分类

办法援用类型语法Lambda表达式
静态方法援用类名::staticMethod(args)->类名.staticMethod(args)
实例办法援用instance::instMethod(args)->instance::instMethod(args)
对象办法援用类名::instMethod(instance,args)->类名::instMethod(args)
构造方法援用类名::new(args)->new 类名(args)

静态方法援用的定义

如果函数式接口的实现能够通过调用一个静态方法来实现,称之为静态方法利用。

静态方法援用的示例
上面分以下几种状况进行具体测试,测试用例中有要害正文,废话不多说,上代码

  • 无参数,无返回值
public static double getPrice() {    double price = 20.00;    System.out.println("get price:" + price);    return price;}public static void printPrice() {    System.out.println("print price:" + 15.00);}/** * lambda表达式,静态方法援用 * 无参数,无返回值 */@Testpublic void testNoReturnValue() {    /**     * 通过lambda表达式调用,其中getPrice()有返回值,因为仅仅是调用执行办法,而不把后果返回,所以这样应用正确     *     */    Runnable r1 = () -> {        LambdaStaticMethodTest.getPrice();    };    Runnable r2 = () -> LambdaStaticMethodTest.getPrice();    /**     * 将r1/r2改写为静态方法援用     */    Runnable r3 = LambdaStaticMethodTest::getPrice;    r1.run();    r2.run();    r3.run();    Runnable r4 = () -> {        LambdaStaticMethodTest.printPrice();    };    Runnable r5 = () -> LambdaStaticMethodTest.printPrice();    /**     * 将r4/r5改写为静态方法援用     */    Runnable r6 = LambdaStaticMethodTest::printPrice;    r4.run();    r5.run();    r6.run();}
  • 无参数,有返回值
/** * lambda表达式,静态方法援用 * 无参数,有返回值 */@Testpublic void testReturnValue() {    /**     * 应用java8自带的函数式接口,无参有返回值,其中lambda body体应用了静态方法:类名.静态方法名()     */    Supplier<Double> s1 = () -> {        return LambdaStaticMethodTest.getPrice();    };    Supplier<Double> s2 = () -> LambdaStaticMethodTest.getPrice();    /**     * 将s1/s2改写为静态方法援用     */    Supplier<Double> s3 = LambdaStaticMethodTest::getPrice;    s1.get();    s2.get();    s3.get();}
  • 有参数,无返回值
public static void setName(String name) {    System.out.println("name:" + name);}public static String queryName(String name) {    System.out.println("name:" + name);    return name;}@Testpublic void testOneArgNoRetrunValue() {    /**     * java.util.function.Consumer是java8自带的函数式接口,接管一个参数,无返回值     *     * 因为无返回值,调用静态方法是否有返回值都不影响,如下     */    Consumer<String> c1 = (name) -> LambdaStaticMethodTest.setName(name);    Consumer<String> c2 = name -> LambdaStaticMethodTest.setName(name);    Consumer<String> c3 = (name) -> LambdaStaticMethodTest.queryName(name);    Consumer<String> c4 = name -> LambdaStaticMethodTest.queryName(name);    /**     * 将c1/c2/c3/c4 改写为静态方法援用     */    Consumer<String> c5 = LambdaStaticMethodTest::setName;    Consumer<String> c6 = LambdaStaticMethodTest::queryName;    c1.accept("c1");    c2.accept("c2");    c3.accept("c3");    c4.accept("c4");    c5.accept("c5");    c6.accept("c6");}
  • 有参数,有返回值
public static String queryInfo(String name, String sex) {    String info = "name:" + name + ",sex:" + sex;    System.out.println(info);    return info;}public static Integer length(String name) {    return name.length();}/** * lambda 静态方法援用 * 有参数,有返回值 */@Testpublic void testArgsReturnValue() {    /**     * java.util.function.Function 是java8自带的函数式接口,接管一个参数,有返回值     *     * lambda 函数式接口实现局部应用了静态方法:类名.办法名     */    Function<String, Integer> f1 = name -> LambdaStaticMethodTest.length(name);    /**     * 将f1改写为静态方法援用,只须要写类名和办法名即可,简洁了很多     */    Function<String, Integer> f2 = LambdaStaticMethodTest::length;    /**     * java.util.function.BinaryOperator 是java8自带的函数式接口,接管2个输出参数,有返回值     *     * lambda 函数式接口实现局部应用了静态方法:类名.办法名     */    BinaryOperator<String> b1 = (s1, s2) -> LambdaStaticMethodTest.queryInfo(s1, s2);    /**     * 将b1改写为静态方法援用,只须要写类名和办法名即可,简洁了很多     */    BinaryOperator<String> b2 = LambdaStaticMethodTest::queryInfo;    System.out.println(f1.apply("java"));    System.out.println(f2.apply("java"));        System.out.println(b1.apply("zhang san","男"));    System.out.println(b1.apply("李四","男"));}

自己程度无限,如有谬误之处,关注公众号拍砖