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("李四","男"));}
自己程度无限,如有谬误之处,关注公众号拍砖