Java 8新特性

lambda表达式

函数式编程思想:强调做什么,而不是怎么做. 只要能获取结果,谁去做怎么做不重要,重要的是结果,而不是过程.

面向对象:做一件事就去找能做这个事的对象,调用对象的方法去完成事情

原本冗余的代码可以更加清楚,减少代码量

Runnable接口实现多线程, 匿名内部类----

Lambda表达式的标准格式

他省去了面向对象的条条框框,右三部分组成

一些参数

一个箭头

一段代码

(参数类型 参数名称)->{代码语句}

省略规则:

小括号内的参数类型可以省略

如果小括号里有且仅有一个参数,那么小括号也可省略

如果大括号有且仅有一个语句,无论是否有返回值,都可以省略大括号,return关键字及语句分好

使用前提:

使用lambda必须具有接口,且要求接口中只有一个方法

使用lambda必须具有上下文推断

函数式接口:

概念: 有且只有一个抽象方法的接口

语法糖! 指使用更加方便,但是原理不变的代码语法,例如for each 其实底层原理就是迭代器,,应用方面Java中的lambda就是匿名内部类的语法糖!

@FunctionalInterface注解

表示,只要用这个注解,编译器就会强制的检查接口是否确实只有一个方法,否则就会报错.

lambda的延迟执行

public class TestDelayedExecute {
//性能浪费的日志案例
private static void log(int level ,String msg){
if (level==1){
System.out.println(msg);
}
}
//利用lambda表达式延迟执行
private static void log2(int level,MessageBuilder printMsg){
if (level ==1){
System.out.println(printMsg.printMsg());
}
}
//测试
public static void main(String[] args) {
String msgA = "I ";
String msgB = "Love ";
String msgc = "Java";
log(1,msgA+msgB+msgc);
log2(2,()->{
System.out.println("我是执行了的Lambda");
return msgA+msgB+msgc;
});
}
}
@FunctionalInterface
interface MessageBuilder{
String printMsg();
}

lambda作为参数和返回值

常用的函数式接口

被提供主要在java . util. function包中

supplier接口 只有一个无参的方法 表示生产一个数据

Consumer接口 与supplier相反 ,为消费一个数据

Predicate接口

Function接口

Stream流及方法引用

stream流不同于IO流是一个完全不一样的概念

流式思想 : 类似于工厂车间的"生产流水线"

stream流的获取:

collection集合都可以通过stream流来获取

根据collection来获取

根据map来获取

根据数组来获取

stream流的方法

延迟方法:返回值类型仍然是 Stream 接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方 法均为延迟方法。)

终结方法:返回值类型不再是 Stream 接口自身类型的方法,因此不再支持类似 StringBuilder 那样的链式调 用。本小节中,终结方法包括 count 和 forEach 方法。 **

forEach:逐一处理

filter:过滤

count: 统计个数

limit:取用前几个

skip 跳过前几个

contact: 组合

方法的引用

冗余的lambda场景

双冒号::为引用运算符,而在表达式中被称为 方法引用