关于java:玩转Lambda表达式二静态方法引用

8次阅读

共计 3297 个字符,预计需要花费 9 分钟才能阅读完成。

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 表达式,静态方法援用
 * 无参数,无返回值
 */
@Test
public 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 表达式,静态方法援用
 * 无参数,有返回值
 */
@Test
public 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;
}

@Test
public 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 静态方法援用
 * 有参数,有返回值
 */
@Test
public 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("李四","男"));
}

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

正文完
 0