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)是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。集合讲的是数据,流讲的是计算。

注意
  1. Stream自己不会存储元素
  2. Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream
  3. Stream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行
操作步骤
  1. 创建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);
    
  2. 中间操作

    一个中间操作链,对数据源的数据进行处理

    筛选与切片

    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中元素做汇总的方法
    
  3. 终止操作

    一个终止操作,执行中间操作链,产生结果

    多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”

    //中间操作
    Stream<Employee> stream = employees.stream().filter((e) -> {    System.out.println("Stream API 的中间操作");
     return e.getAge() > 35;
    });
    //终止操作
    stream.forEach(System.out::println);