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