img

函数式

  1. 函数式接口就是只定义一个抽象方法的接口

  2. 函数式接口的抽象方法的签名称为函数描述符。

    • Predicate:java.util.function.Predicate接口定义了一个名叫test的抽象方法,它接受泛型T对象,并返回一个boolean。
    • Consumer:java.util.function.Consumer接口定义了一个名叫accept的抽象方法,它接受泛型T的对象,没有返回(void)。
    • Function:java.util.function.Function<T, R>接口定义了一个叫作apply的抽象方法,它接受泛型T的对象,并返回一个泛型R的对象。
    • DoublePredicate、IntConsumer、LongBinaryOperator、IntFunction、ToIntFunction、IntToDoubleFunction

常用方法

  1. filter 筛选
  2. distinct 去重 (据流所生成元素的hashCode和equals方法实现)
  3. 切片
    • takeWhile 遭遇第一个不符合要求的元素时停止处理
    • dropWhile 它会从头开始,丢弃所有谓词结果为false的元素。一旦遭遇谓词计算的结果为true,它就停止处理,并返回所有剩余的元素,即便要处理的对象是一个由无限数量元素构成的流,它也能工作得很好
  4. limit 截短流
  5. skip 跳过元素
  6. map 映射 (使用映射一词,是因为它和转换类似,但其中的细微差别在于它是“创建一个新版本”而不是去“修改”)
  7. flatMap 扁平化为一个流,把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流
  8. allMatch 匹配所有元素
  9. anyMatch 至少匹配一个
  10. noneMatch 没有任何匹配元素
  11. findAny 返回当前流中的任意元素
  12. findFist 查找第一个元素

原始类型流特化

Java 8引入了三个原始类型特化流接口来解决这个问题:IntStream、DoubleStream和LongStream,分别将流中的元素特化为int、long和double,从而避免了暗含的装箱成本。

常用方法

mapToInt、mapToDouble和mapToLong

转换回对象流

boxed

数值范围

  1. range 不包含结束值
  2. rangeClosed 包含结束值

构建流

由值创建流
Stream<String> java = Stream.of("java", "php", "js");
Stream<Object> empty = Stream.empty(); //创建空流
由数组创建流
int[] numbers = {2,3,4,5,11,23};
IntStream stream = Arrays.stream(numbers);
由文件生成流
由函数生成无限流
  1. Stream.iterate
  2. Stream.generate