Java基础知识

JDK8中Stream及Optional学习笔记

2019-07-17  本文已影响0人  海涛_meteor

Stream流

普通循环写法,迭代在外部进行
流式写法,迭代由内部控制,内部迭代将更多控制权交给了集合类

Stream的使用非常类似建造者模式

Stream中的方法通常分为以下两种:

  1. 惰性求值:不会进行方法执行,其特征:返回值为stream

  2. 及早求值:会触发方法执行

Stream的常用方法

高阶函数:如果函数的参数列表里包含函数接口,或该函数返回一个函数接口,那么该函数就是高阶函数,例如map方法

数值流

数值流包含IntStreamLongStreamDoubleStream,它们避免了隐形的拆箱成本,并且实现了一些独有的数值计算方法,如maxmin/maxaveragerange/rangedsummaryStatistics等,需要转换回对象流可以使用boxed方法,或者mapToObj方法

创建流的方式

  1. 由值创建:
Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
  1. 由数组创建:
int[] numbers = {2, 3, 5, 7, 11, 13}; int sum = Arrays.stream(numbers).sum();
  1. 由文件创建:
Stream<String> lines =
Files.lines(Paths.get("data.txt"), Charset.defaultCharset());
  1. 由函数创建:
Stream.iterate(0, n -> n + 2).limit(10).forEach(System.out::println);

Stream.generate(Math::random).limit(5).forEach(System.out::println);

Optional

Optional<T>是一个容器类,代表一个值存在或不存在,使用Optional<T>定义属性的类型可以清楚说明属性是否支持为null

创建Optional对象
  1. 声明一个空的Optional
Optional<Car> optCar = Optional.empty();
  1. 依据一个非空值创建Optional
Optional<Car> optCar = Optional.of(car);
  1. 可接受null的Optional
Optional<Car> optCar = Optional.ofNullable(car);
Optional无法序列化

Optional<T>类型的属性无法序列化,实在需要用到的情况可以采用以下方式

public class Person {
    private Car car;
    public Optional<Car> getCarAsOptional() {
        return Optional.ofNullable(car);
    }
}
Optional的常用方法

收集器工具类Collectors

可在Streamcollect方法中使用

并行化流

并行流底层使用了fork/join框架,因此能重复将数据结构对半分解的难易程度,决定了分解操作的快慢,如支持随机读取的数组并行化处理的性能最好,其次是TreeSetHashSet这样不易公平分解的数据类型,最差的是LinkedList这样长度未知的数据类型。

并行化数组操作

可以通过工具类Arrays进行,其主要方法有

上一篇 下一篇

猜你喜欢

热点阅读