只有光头才能变强。java
文本已收录至个人GitHub仓库,欢迎Star:github.com/ZhongFuChen…git
中秋去了躺上海,在外滩上打了个卡:github
紧接着学了一下Java的函数式编程,给你们整理了一下,一块儿学习!编程
以前写Optional这个类的时候,简单说了一下Lambda是怎么用的,这里再跟你们一块儿回顾一下,Lambda的语法是这样的:ide
以Lambda语法建立线程和匿名内部类建立线程的区别(显然代码少了不少!):函数式编程
public static void main(String[] args) {
// 用匿名内部类的方式来建立线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("公众号:Java3y---关注我!");
}
});
// 使用Lambda来建立线程
new Thread(() -> System.out.println("公众号:Java3y---关注我!"));
}
复制代码
使用Lambda表达式,实际就是建立出该接口的实例对象。函数
图示;Runnable接口来举例:学习
使用Labmda表达式须要函数式编程接口,好比在Runnable接口上咱们能够看到@FunctionalInterface
注解(标记着这个接口只有一个抽象方法)优化
从上面的代码例子能够看出,咱们使用Lambda表达式建立线程的时候,并不关心接口名,方法名,参数名。咱们只关注他的参数类型,参数个数,返回值。spa
JDK原生就给咱们提供了一些函数式编程接口方便咱们去使用,下面是一些经常使用的接口:
简单说明一下:
Demo:
// Consumer 一个入参,无返回值
Consumer<String> consumer = s-> System.out.println(s);
consumer.accept("Java3y");
// Supplier 无入参,有返回值
Supplier<String> supplier = () -> "Java4y";
String s = supplier.get();
System.out.println(s);
//.....
复制代码
使用Lambda时,要记住的就两点:
在学Lambda的时候,还可能会发现一种比较奇怪的写法,例以下面的代码:
// 方法引用写法
Consumer<String> consumer = System.out::println;
consumer.accept("Java3y");
复制代码
若是按正常Lambda的写法多是这样的:
// 普通的Lambda写法
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Java3y");
复制代码
显然使用方法引用比普通的Lambda表达式又简洁了一些。
若是函数式接口的实现刚好能够经过调用一个方法来实现,那么咱们可使用方法引用
方法引用又分了几种:
方法引用Demo:
public class Demo {
public static void main(String[] args) {
// 静态方法引用--经过类名调用
Consumer<String> consumerStatic = Java3y::MyNameStatic;
consumerStatic.accept("3y---static");
//实例方法引用--经过实例调用
Java3y java3y = new Java3y();
Consumer<String> consumer = java3y::myName;
consumer.accept("3y---instance");
// 构造方法方法引用--无参数
Supplier<Java3y> supplier = Java3y::new;
System.out.println(supplier.get());
}
}
class Java3y {
// 静态方法
public static void MyNameStatic(String name) {
System.out.println(name);
}
// 实例方法
public void myName(String name) {
System.out.println(name);
}
// 无参构造方法
public Java3y() {
}
}
复制代码
结果以下:
Lambda虽然代码看起来是简洁,可是若是复杂的话仍是比较难看明白的。
在学习Lambda的时候,首先咱们得知道有哪些经常使用函数式编程接口,这些函数式编程接口的有什么区别(参数个数、返回值类型)
Lambda表达式返回的是接口对象实例,若是函数式接口的实现刚好能够经过调用一个方法来实现,那么咱们可使用方法引用来替代Lambda表达式
最后再完整举个例子:
// Supplier是一个无入参带返回的值的函数式编程接口
// () -> new Java3y()这整句Lambda表达式,返回的是Supplier接口的实例。从Lambda表达式能够看出无参数,带返回值
Supplier<Java3y> supplier = () -> new Java3y();
// 因为这个“() -> new Java3y()”Lambda表达式能够经过调用一个方法就实现了,那么咱们能够优化成方法引用
Supplier<Java3y> supplier2 = Java3y::new;
复制代码
乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,关注便可获取!
以为个人文章写得不错,点赞!