速度更快
优化HashMap 实现
底层结构使用红黑树实现,查询速度提升了
代码更少
函数式接口(FunctionalInterface)
只包含一个抽象方法的接口被称为函数式接口,可用注解:@FunctionalInterface标注检查,并防止被修改
Java 内置四大核心函数式接口
Comsumer 消费型接口
参数:T ,返回类型:void,包含方法:void accept(T t);
Supplier 供给型接口
参数:无,返回类型:T, 包含方法:T get();
Function<T,R> 函数型接口
参数T,返回R 包含方法:R apply(T t);
Predicate 断定型接口
参数 T,返回 boolean,包含方法:boolean test(T t);
Lambda表达式
Lambda表达式本质上就是函数式接口的一个实例
lambda表达式的六种写法
package Java8;
import org.junit.Test;
import java.util.Comparator;
import java.util.function.Consumer;
public class LambdaTest {
/**
* ->左侧:lambda形参列表的参数类型可省略(类型推断);如果lambda形参列表只有一个参数,则参数括号可省。
* ->右侧:lambda方法体只有一条语句,大括号与return可省
* 依赖于函数式接口
* lambda本质:作为函数式接口的实例
*/
// Lambda表达式的本质是作为接口的实例
//1 无参 无返回值
@Test
public void test1(){
Runnable runnable = () -> System.out.println("无参 无返回值");
}
@Test
public void test2(){
//普通写法
Consumer<String> con = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
con.accept("有参 无返回 普通写法");
// Lambda 表达式写法 显示类型
Consumer<String> co1 = (String s) -> {System.out.println(s);};
co1.accept("lambda 写法2");
// 类型推断
Consumer<String> co2 = (s) -> {System.out.println(s);};
co2.accept("lambda 写法3");
// 参数为1 时,形参括号可省
Consumer<String> co3 = s -> {System.out.println(s);};
co3.accept("lambda 写法4");
//执行语句唯一时,大括号可省,return 也可省
Consumer<String> co4 = s -> System.out.println(s);
co4.accept("lambda 写法5");
}
@Test
public void test3(){
Comparator<Integer> com1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
};
System.out.println(com1.compare(1,2));
//多个参数一条语句
Comparator<Integer> com2 = (o1,o2) -> o1.compareTo(o2);
}
}
方法引用、构造器引用
方法引用
方法引用可以看作是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
使用格式
- 类 :: 非静态方法
- 类 :: 静态方法
- 对象 :: 非静态方法
要求:接口中的抽象方法的形参列表和返回值类型与方法引用相同
Consumer<String> co = System.out :: println;
co.accept("方法引用");
构造器引用
与方法引用类似,函数式接口的抽象方法的形参列表与构造器一致,抽象方法的返回值类型与
Supplier<Coffee> coffeeBuild = Cappuccino::new;
Coffee cof = coffeeBuild.get();
System.out.println(cof.getClass().getSimpleName());
强大的 Stream API
可以极大地提供Java程序员的生产力,让程序员写出高效、干净、简洁的代码。
Stream API提供了
Stream与Collection的区别,集合是处理数据的,Stream计算
Stream 是延迟执行的
- 创建Stream:获取一个流
- 中间操作
- 终止操作