一、扯淡 Why Java8 Streams?
为什么要学习java8 流技术 、Lambda 表达式等 ?
一个很好的目的就是:
- 希望最简单的并发执行你的程序,且避免用 Synchronized控制线程安全。
- 采用Stream技术,再也用不着去费劲搞Thread多线程了。
- 使用Java 8,你就是在保护你作为Java工程师的职业生涯 _
二、What is 函数式接口 ?
函数式接口的概念:只定义一个抽象方法的接口
用函数式接口可以干什么呢? Lambda表达式最喜欢函数式接口!
举例说明:定义一个只有一个方法的接口,实现该接口打印字符串"Hello !"
第一步 定义接口
@FunctionalInterface
public interface ShowMsg {
void printMSG();
}
注解 @FunctionalInterface 的作用类似于 @Overried, 表示限制只能有一个接口
第二步 实现接口
public class ShowMsgHello implements ShowMsg {
@Override
public void printMsg() {
System.out.println("Hello !");
}
}
第三步 测试接口
public static void main(String[] args) {
ShowMsg show = new ShowMsgHello();
show.printMsg();
}
第三步 换一种方式测试接口
如果采用Lambda表达式则可以不用定义实现类,直接一行代码即可:
public static void main(String[] args) {
ShowMsg show = () -> System.out.println("Hello !");
show.printMsg();
}
主要看操作符 “->” , 请不要把它看成类似于C++里面的指针什么的,
通俗讲它就是一个分割符,分割函数参数部分和函数体部分。
整个 “() -> System.out.println(“Hello !”) ”这段代码其实就是接口ShowMsg的匿名类实例对象。
针对其他类别的抽象方法的处理如下:
(1)如果接口方法是:void printMsg(String msg);
则 Lambda表达式:(msg) -> System.out.println(msg);
或者:msg -> System.out.println(msg); // 单个参数可以舍弃参数两边的”(”和”)” ,多个参数则必须有两边的”(”和”)”。
(2)如果接口方法是:String printMsg( );
则Lambda表达式:() -> “Hello !”; // 这里无需 return 关键字
(3)如果函数体内语句多个则需要“{}”
Lambda表达式:() -> {String msg = “Hello !”; System.out.println(msg);};
三、总结
- 函数式接口就是只定义一个抽象方法的接口
- Lambda表达式可直接作为一个函数式接口的匿名实现类对象(一个实实在在的Java实体对象)
没有java8之前也有很多函数式接口:
java.util.Comparator
public interface Comparator<T> {
int compare(T o1, T o2);
}
java.lang.Runnable
public interface Runnable{
void run();
}
Comparator 和 Runnable 都是耳熟能详的老接口了。
没有Lambda的年代采用匿名内部类:
看上去很笨拙
Runnable r2 = new Runnable(){
public void run(){
System.out.println("Hello World 2");
}
};
进入 Lambda 的时代:
Runnable r1 = () -> System.out.println("Hello World 1");
是否让你感觉很简洁 ?
Over …