Java 8
Lambda 表达式
是一种语法糖,用于替代匿名内部类
@FunctionalInterface
interface I1{
void fun(String str);
}
I1 i1 = new I1() {
@Override
public void fun(String str) {
}
};
//变成
I1 i1 = str -> {
};
适用范围:只能替代函数式接口的匿名内部类
函数式接口
一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}
方法引用
构造器引用:它的语法是Class::new,或者更一般的Class< T >::new
final Car car = Car.create( Car::new );
final List< Car > cars = Arrays.asList( car );
静态方法引用:它的语法是Class::static_method
cars.forEach( Car::collide );
特定类的任意对象的方法引用:它的语法是Class::method
cars.forEach( Car::repair );
特定对象的方法引用:它的语法是instance::method
final Car police = Car.create( Car::new ); cars.forEach( police::follow );
默认方法
默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。我们只需在方法名前面加个 default 关键字即可实现默认方法。
public interface Vehicle {
default void print(){
System.out.println("我是一辆车!");
}
}
Stream
流(Stream)是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。集合讲的是数据,流讲的是计算。
注意
- Stream自己不会存储元素
- Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream
- Stream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行
操作步骤
-
创建Stream
一个数据源(如集合、数组),获取一个流
//1. 可以通过Collection系列提供的stream()或parallelStream() List<String> list = new ArrayList<>(); Stream<String> stream1 = list.stream(); //2. 通过Arrays中的静态方法stream()获取数组流 String[] strings = new String[10]; Stream<String> stream2 = Arrays.stream(strings); //3. 通过Stream类中的静态方法of() Stream<String> stream3 = Stream.of("aa","bb","cc"); //4. 创建无限流 //迭代 Stream<Integer> stream4 = Stream.iterate(0,(x) -> x+2); stream4.limit(10).forEach(System.out::println); //生成 Stream.generate(() -> Math.random()) .limit(5) .forEach(System.out::println);
-
中间操作
一个中间操作链,对数据源的数据进行处理
筛选与切片
filter(Predicate p)//接收Lambda,从流中排除某些元素 distinct()//筛选,通过流所生成元素的hashCode()和equals()去除重复元素 limit(long maxSize)//截断流,使其元素不超过给定数量 skip(long n)//跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补
映射
map //接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素 flatMap //接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
排序
sorted() //自然排序 sorted(Compared com) //定制排序
查找与匹配
allMatch //检查是否匹配所有元素 anyMatch //检查是否至少匹配一个元素 noneMatch //检查是否没有匹配所有元素 findFirst //返回第一个元素 count //返回流中元素的总个数 max //返回流中最大值 min //返回流中最小值
规约
reduce(T identity, BinaryOperator)/reduce(BinaryOperator) //可以将流中元素反复结合起来,得到一个值
收集
collect //将流转换为其他形式,接收一个Collector接口的实现,用于给Stream中元素做汇总的方法
-
终止操作
一个终止操作,执行中间操作链,产生结果
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”
//中间操作 Stream<Employee> stream = employees.stream().filter((e) -> { System.out.println("Stream API 的中间操作"); return e.getAge() > 35; }); //终止操作 stream.forEach(System.out::println);