Java8

Date Api

Java8引入了LocalDate与LocalDateTime来解决日期处理方法,同时引入了一个新的类DateTimeFormatter 来解决日期格式化问题。

接口的默认方法

Java8能通过使用default关键字向接口添加非抽象方法实现。

interface Formula{

    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }

}
复制代码

Formula 接口中除了抽象方法计算接口公式还定义了默认方法 sqrt。 实现该接口的类只需要实现抽象方法 calculate。 默认方法sqrt 可以直接使用。当然你也可以直接通过接口创建对象,然后实现接口中的默认方法就可以了,我们通过代码演示一下这种方式。

public class Main {

  public static void main(String[] args) {
    // 通过匿名内部类方式访问接口
    Formula formula = new Formula() {
        @Override
        public double calculate(int a) {
            return sqrt(a * 100);
        }
    };

    System.out.println(formula.calculate(100));     // 100.0
    System.out.println(formula.sqrt(16));           // 4.0

  }

}
复制代码

formula 是作为匿名对象实现的。该代码非常容易理解,6行代码实现了计算 sqrt(a * 100)。在下一节中,我们将会看到在 Java 8 中实现单个方法对象有一种更好更方便的方法。

不管是抽象类还是接口,都可以通过匿名内部类的方式访问。不能通过抽象类或者接口直接创建对象。对于上面通过匿名内部类方式访问接口,我们可以这样理解:一个内部类实现了接口里的抽象方法并且返回一个内部类对象,之后我们让接口的引用来指向这个对象。


并行流ParalleStream


        Stream<Integer> integerParallelStreamList = List.of(1, 2, 3).parallelStream();

        Stream<String> stringParallelStreamList = List.of("1", "2", "3").parallelStream();
复制代码

不过一般情况下我们并不需要用到并行流,在Stream中元素不过千的情况下性能不会有太大提升,因为将元素分散到不同的cpu计算也是有成本的

无状态方法

无状态方法的执行无需依赖前面方法执行的结果集。

map(mapToInt、mapToLong等等)、filter、flatMap

flatMap

此方法是为了进行一对多元素的平展操作:

        List<Order> orders = List.of(new Order(), new Order());
        Stream<Item> itemStream = orders.stream()
                .flatMap(order -> order.getItemList().stream());
复制代码

比如我们有一个订单,每个订单中都包含了一个商品List,如果我们想要将两个订单中所有商品List组成一个新的商品List,就需要用到flatMap方法。

有状态方法

有状态方法就是它们的方法执行都必须依赖前面方法执行的结果集才能执行

方法名 方法结果
distinct() 元素去重
sorted() 元素排序,重载的两个方法,需要的时候可以传入一个排序对象。
limit(long maxSize) 传入一个数字,代表只取前X个元素
skip(long n) 传入一个数字,代表跳过X个元素,取后面的元素。

1. 连接stream

如果你在两处构造了两个Stream,在使用的时候希望组合在一起使用,可以使用concat():

        Stream<Integer> concat = Stream
                .concat(Stream.of(1, 2, 3), Stream.of(4, 5, 6));
复制代码