Module java.base
Package java.util.stream

Interface LongStream

所有超级接口:
AutoCloseable, BaseStream<Long,LongStream>

public interface LongStream extends BaseStream<Long,LongStream>
支持顺序和并行聚合操作的原始长整型元素序列。这是Streamlong原始特化版本。

以下示例说明了使用StreamLongStream进行聚合操作,计算红色小部件的重量总和:


     long sum = widgets.stream()
                       .filter(w -> w.getColor() == RED)
                       .mapToLong(w -> w.getWeight())
                       .sum();
 
有关流、流操作、流管道和并行性的其他规范,请参阅Stream的类文档和java.util.stream的包文档。
自Java版本:
1.8
另请参见:
  • Method Details

    • filter

      LongStream filter(LongPredicate predicate)
      返回由此流的元素组成的流,同时在从生成的流中消耗元素时对每个元素执行提供的操作。

      这是一个中间操作

      参数:
      predicate - 一个非干扰无状态的谓词,应用于每个元素以确定是否应包含
      返回:
      新流
    • map

      返回由此流的元素应用给定函数的结果组成的流。

      这是一个中间操作

      参数:
      mapper - 一个非干扰无状态的函数,应用于每个元素
      返回:
      新流
    • mapToObj

      <U> Stream<U> mapToObj(LongFunction<? extends U> mapper)
      返回由此流的元素应用给定函数的结果组成的对象值Stream

      这是一个中间操作

      类型参数:
      U - 新流的元素类型
      参数:
      mapper - 一个非干扰无状态的函数,应用于每个元素
      返回:
      新流
    • mapToInt

      IntStream mapToInt(LongToIntFunction mapper)
      返回由此流的元素应用给定函数的结果组成的IntStream

      这是一个中间操作

      参数:
      mapper - 一个非干扰无状态的函数,应用于每个元素
      返回:
      新流
    • mapToDouble

      DoubleStream mapToDouble(LongToDoubleFunction mapper)
      返回由此流的元素应用给定函数的结果组成的DoubleStream

      这是一个中间操作

      参数:
      mapper - 一个非干扰无状态的函数,应用于每个元素
      返回:
      新流
    • flatMap

      LongStream flatMap(LongFunction<? extends LongStream> mapper)
      返回一个流,其中包含将该流的每个元素替换为应用提供的映射函数到每个元素产生的映射流的内容的结果。每个映射流在其内容被放入该流后会被关闭。(如果映射流为null,则使用空流代替。)

      这是一个中间操作

      参数:
      mapper - 一个非干扰无状态的函数,应用于每个元素,产生新值的LongStream
      返回:
      新流
      参见:
    • mapMulti

      default LongStream mapMulti(LongStream.LongMapMultiConsumer mapper)
      返回一个流,其中包含将该流的每个元素替换为多个元素,具体来说是零个或多个元素。替换是通过将提供的映射函数应用于每个元素以及接受替换元素的consumer参数来执行的。映射函数调用消费者零次或多次以提供替换元素。

      这是一个中间操作

      如果consumer参数在应用于映射函数的范围之外使用,则结果是未定义的。

      实现要求:
      默认实现在该流上调用flatMap,传递一个行为如下的函数。首先,它使用一个LongConsumer调用映射函数,该函数将替换元素累积到新创建的内部缓冲区中。当映射函数返回时,它从内部缓冲区创建一个LongStream。最后,它将此流返回给flatMap
      参数:
      mapper - 一个非干扰无状态的函数,生成替换元素
      返回:
      新流
      自 JDK 版本:
      16
      参见:
    • distinct

      LongStream distinct()
      返回一个流,其中包含该流的不同元素。

      这是一个有状态的中间操作

      返回:
      新流
    • sorted

      LongStream sorted()
      返回一个按排序顺序排列的流,其中包含该流的元素。

      这是一个有状态的中间操作

      返回:
      新流
    • peek

      LongStream peek(LongConsumer action)
      返回一个流,其中包含该流的元素,并在从生成的流中消耗元素时对每个元素执行提供的操作。

      这是一个中间操作

      对于并行流管道,操作可能在上游操作提供的任何时间和任何线程中调用。如果操作修改了共享状态,则需要提供所需的同步。

      API 注意:
      此方法主要用于支持调试,您可以在流经管道中的某个特定点看到元素的流动:
      
           LongStream.of(1, 2, 3, 4)
               .filter(e -> e > 2)
               .peek(e -> System.out.println("Filtered value: " + e))
               .map(e -> e * e)
               .peek(e -> System.out.println("Mapped value: " + e))
               .sum();
       

      在流实现能够优化掉某些或所有元素的生成(例如使用findFirst等短路操作,或在描述的示例中使用count()),对于这些元素不会调用操作。

      参数:
      action - 一个非干扰的操作,对从流中消耗的元素执行操作
      返回:
      新流
    • limit

      LongStream limit(long maxSize)
      返回一个流,其中包含该流的元素,截断长度不超过maxSize

      这是一个短路有状态的中间操作

      API 注意:
      虽然limit()在顺序流管道上通常是廉价的操作,但在有序并行管道上,特别是对于较大的maxSize值,可能会非常昂贵,因为limit(n)被限制为返回不仅仅是任何n个元素,而是遵循遇到顺序的n个元素。使用无序流源(例如generate(LongSupplier))或通过BaseStream.unordered()去除排序约束可能会显著加快并行管道中limit()的速度。如果您的情况允许,语义允许,且需要与遇到顺序一致,则需要在并行管道中使用limit()时,如果性能差或内存利用不佳,则切换到顺序执行,可能会提高性能。
      参数:
      maxSize - 流应限制的元素数量
      返回:
      新流
      抛出:
      IllegalArgumentException - 如果maxSize为负数
    • skip

      LongStream skip(long n)
      返回一个流,其中包含该流中丢弃前n个元素后剩余的元素。如果该流包含的元素少于n个,则将返回一个空流。

      这是一个有状态的中间操作

      API 注意:
      虽然skip()在顺序流管道上通常是廉价的操作,但在有序并行管道上,特别是对于较大的n值,可能会非常昂贵,因为skip(n)被限制为跳过不仅仅是任何n个元素,而是遵循遇到顺序的n个元素。使用无序流源(例如generate(LongSupplier))或通过BaseStream.unordered()去除排序约束可能会显著加快并行管道中skip()的速度。如果您的情况允许,语义允许,且需要与遇到顺序一致,则需要在并行管道中使用skip()时,如果性能差或内存利用不佳,则切换到顺序执行,可能会提高性能。
      参数:
      n - 要跳过的前导元素数量
      返回:
      新流
      抛出:
      IllegalArgumentException - 如果n为负数
    • takeWhile

      default LongStream takeWhile(LongPredicate predicate)
      如果该流是有序的,则返回一个流,其中包含从该流中获取的与给定谓词匹配的元素的最长前缀。否则,如果该流是无序的,则返回一个流,其中包含从该流中获取的与给定谓词匹配的元素的子集。

      如果该流是有序的,则最长前缀是该流的元素的连续序列,这些元素与给定谓词匹配。序列的第一个元素是该流的第一个元素,紧随序列最后一个元素的元素不匹配给定谓词。

      如果该流是无序的,并且该流的一些(但不是全部)元素与给定谓词匹配,则此操作的行为是不确定的;它可以获取匹配元素的任何子集(包括空集)。

      无论该流是有序还是无序,如果该流的所有元素都与给定谓词匹配,则此操作获取所有元素(结果与输入相同),或者如果流的没有元素与给定谓词匹配,则不获取任何元素(结果是空流)。

      这是一个短路有状态的中间操作

      API注释:
      虽然takeWhile()在顺序流水线上通常是廉价的操作,但在有序并行流水线上可能会非常昂贵,因为该操作受限于返回不仅是任何有效前缀,而是遵循遇到顺序中元素的最长前缀。使用无序流源(例如generate(LongSupplier))或通过BaseStream.unordered()去除排序约束可能会显著加快并行流水线中takeWhile()的速度,如果您的情况允许语义。如果需要与遇到顺序一致,并且在并行流水线中使用takeWhile()时遇到性能或内存利用问题,则切换到使用BaseStream.sequential()进行顺序执行可能会提高性能。
      实现要求:
      默认实现获取此流的spliterator,包装该spliterator以支持遍历此操作的语义,并返回与包装的spliterator关联的新流。返回的流保留此流的执行特性(即根据BaseStream.isParallel()的并行或顺序执行),但包装的spliterator可能选择不支持拆分。当关闭返回的流时,将调用返回流和此流的关闭处理程序。
      参数:
      predicate - 一个非干扰无状态的谓词,用于应用于元素以确定元素的最长前缀。
      返回:
      新流
      自版本:
      9
    • dropWhile

      default LongStream dropWhile(LongPredicate predicate)
      如果此流是有序的,则返回一个流,该流由删除与给定谓词匹配的元素的最长前缀后剩余的元素组成。否则,如果此流是无序的,则返回一个流,该流由删除与给定谓词匹配的元素的子集后剩余的元素组成。

      如果此流是有序的,则最长前缀是此流的元素的连续序列,这些元素与给定谓词匹配。序列的第一个元素是此流的第一个元素,序列的最后一个元素之后的元素不匹配给定谓词。

      如果此流是无序的,并且此流的一些(但不是全部)元素与给定谓词匹配,则此操作的行为是不确定的;它可以自由地删除任何匹配元素的子集(包括空集)。

      无论此流是有序还是无序,如果此流的所有元素都与给定谓词匹配,则此操作会删除所有元素(结果是空流),或者如果流的没有元素与给定谓词匹配,则不会删除任何元素(结果与输入相同)。

      这是一个有状态的中间操作

      API注释:
      虽然dropWhile()在顺序流水线上通常是廉价的操作,但在有序并行流水线上可能会非常昂贵,因为该操作受限于返回不仅是任何有效前缀,而是遵循遇到顺序中元素的最长前缀。使用无序流源(例如generate(LongSupplier))或通过BaseStream.unordered()去除排序约束可能会显著加快并行流水线中dropWhile()的速度,如果您的情况允许语义。如果需要与遇到顺序一致,并且在并行流水线中使用dropWhile()时遇到性能或内存利用问题,则切换到使用BaseStream.sequential()进行顺序执行可能会提高性能。
      实现要求:
      默认实现获取此流的spliterator,包装该spliterator以支持遍历此操作的语义,并返回与包装的spliterator关联的新流。返回的流保留此流的执行特性(即根据BaseStream.isParallel()的并行或顺序执行),但包装的spliterator可能选择不支持拆分。当关闭返回的流时,将调用返回流和此流的关闭处理程序。
      参数:
      predicate - 一个非干扰无状态的谓词,用于应用于元素以确定元素的最长前缀。
      返回:
      新流
      自版本:
      9
    • forEach

      void forEach(LongConsumer action)
      对此流的每个元素执行操作。

      这是一个终端操作

      对于并行流水线,此操作不保证遵守流的遇到顺序,因为这样做将牺牲并行性的好处。对于任何给定元素,操作可能在库选择的任何时间和任何线程中执行。如果操作访问共享状态,则负责提供所需的同步。

      参数:
      action - 一个非干扰操作,用于对元素执行
    • forEachOrdered

      void forEachOrdered(LongConsumer action)
      对此流的每个元素执行操作,保证对具有定义的遇到顺序的流中的每个元素按遇到顺序进行处理。

      这是一个终端操作

      参数:
      action - 一个非干扰操作,用于对元素执行
      参见:
    • toArray

      long[] toArray()
      返回包含此流的元素的数组。

      这是一个终端操作

      返回:
      包含此流的元素的数组
    • reduce

      long reduce(long identity, LongBinaryOperator op)
      对此流的元素执行归约,使用提供的身份值和一个关联累积函数,并返回归约值。这等效于:
      
           long result = identity;
           for (long element : this stream)
               result = accumulator.applyAsLong(result, element)
           return result;
       
      但不受限于顺序执行。

      identity值必须是累加函数的身份。这意味着对于所有xaccumulator.apply(identity, x)等于x。累加函数必须是一个关联函数。

      这是一个终端操作

      API注释:
      求和、最小值、最大值和平均值都是归约的特殊情况。对一系列数字求和可以表示为:
      
           long sum = integers.reduce(0, (a, b) -> a+b);
       
      或更简洁地:
      
           long sum = integers.reduce(0, Long::sum);
       

      虽然这可能看起来比在循环中简单地改变运行总数更为迂回,但归约操作更加优雅地并行化,无需额外的同步,并大大减少了数据竞争的风险。

      参数:
      identity - 累加函数的身份值
      op - 一个关联非干扰无状态函数,用于组合两个值
      返回:
      归约的结果
      参见:
    • reduce

      对此流的元素执行归约,使用一个关联累积函数,并返回描述归约值的OptionalLong,如果有的话。这等效于:
      
           boolean foundAny = false;
           long result = null;
           for (long element : this stream) {
               if (!foundAny) {
                   foundAny = true;
                   result = element;
               }
               else
                   result = accumulator.applyAsLong(result, element);
           }
           return foundAny ? OptionalLong.of(result) : OptionalLong.empty();
       
      但不受限于顺序执行。

      累加函数必须是一个关联函数。

      这是一个终端操作

      参数:
      op - 一个关联非干扰无状态函数,用于组合两个值
      返回:
      归约的结果
      参见:
    • collect

      <R> R collect(Supplier<R> supplier, ObjLongConsumer<R> accumulator, BiConsumer<R,R> combiner)
      执行此流的元素上的可变减少操作。可变减少是指减少值是可变结果容器(例如ArrayList)的一种情况,并且元素通过更新结果的状态而不是替换结果来合并。这会产生一个等效于:
      
           R result = supplier.get();
           for (long element : this stream)
               accumulator.accept(result, element);
           return result;
       

      reduce(long, LongBinaryOperator)类似,collect操作可以并行化,而无需额外的同步。

      这是一个终端操作

      类型参数:
      R - 可变结果容器的类型
      参数:
      supplier - 创建新的可变结果容器的函数。对于并行执行,此函数可能会被多次调用,并且必须每次返回一个新值。
      accumulator - 一个关联非干扰无状态函数,必须将一个元素合并到结果容器中。
      combiner - 一个关联非干扰无状态函数,接受两个部分结果容器并合并它们,必须与累加器函数兼容。组合器函数必须将第二个结果容器中的元素合并到第一个结果容器中。
      返回:
      减少的结果
      参见:
    • sum

      long sum()
      返回此流中元素的总和。这是一个减少的特殊情况,等效于:
      
           return reduce(0, Long::sum);
       

      这是一个终端操作

      返回:
      此流中元素的总和
    • min

      OptionalLong min()
      返回描述此流的最小元素的OptionalLong,如果此流为空则返回一个空的可选项。这是减少的特殊情况,等效于:
      
           return reduce(Long::min);
       

      这是一个终端操作

      返回:
      包含此流的最小元素的OptionalLong,如果流为空则返回一个空的OptionalLong
    • max

      OptionalLong max()
      返回描述此流的最大元素的OptionalLong,如果此流为空则返回一个空的可选项。这是减少的特殊情况,等效于:
      
           return reduce(Long::max);
       

      这是一个终端操作

      返回:
      包含此流的最大元素的OptionalLong,如果流为空则返回一个空的OptionalLong
    • count

      long count()
      返回此流中元素的计数。这是减少的特殊情况,等效于:
      
           return map(e -> 1L).sum();
       

      这是一个终端操作

      API 注意:
      如果能够直接从流源计算计数,实现可能选择不执行流管道(顺序或并行)。在这种情况下,不会遍历任何源元素,也不会评估任何中间操作。具有副作用的行为参数(除了像调试这样的无害情况)可能会受到影响。例如,考虑以下流:
      
           LongStream s = LongStream.of(1, 2, 3, 4);
           long count = s.peek(System.out::println).count();
       
      流源涵盖的元素数量是已知的,中间操作peek不会向流中注入或移除元素(这可能是flatMapfilter操作的情况)。因此,计数为4,不需要执行管道,并且作为副作用打印出元素。
      返回:
      此流中元素的计数
    • average

      OptionalDouble average()
      返回描述此流中元素的算术平均值的OptionalDouble,如果此流为空则返回一个空的可选项。这是减少的特殊情况。

      这是一个终端操作

      返回:
      包含此流的平均元素的OptionalDouble,如果流为空则返回一个空的可选项
    • summaryStatistics

      LongSummaryStatistics summaryStatistics()
      返回描述此流中元素的各种摘要数据的LongSummaryStatistics。这是减少的特殊情况。

      这是一个终端操作

      返回:
      描述此流中元素的各种摘要数据的LongSummaryStatistics
    • anyMatch

      boolean anyMatch(LongPredicate predicate)
      返回此流中任何元素是否与提供的谓词匹配。如果不需要确定结果,则可能不会对所有元素评估谓词。如果流为空,则返回false,并且不会评估谓词。

      这是一个短路终端操作

      API 注意:
      此方法评估流的元素上的谓词的存在量化(对于某个x P(x))。
      参数:
      predicate - 一个非干扰无状态的谓词,应用于此流的元素
      返回:
      如果流的任何元素与提供的谓词匹配,则为true,否则为false
    • allMatch

      boolean allMatch(LongPredicate predicate)
      返回此流中所有元素是否都与提供的谓词匹配。如果不需要确定结果,则可能不会对所有元素评估谓词。如果流为空,则返回true,并且不会评估谓词。

      这是一个短路终端操作

      API 注意:
      此方法评估流的元素上的谓词的全称量化(对于所有x P(x))。如果流为空,则量化被认为是空虚满足,并且始终为true(不管P(x)如何)。
      参数:
      predicate - 一个非干扰无状态的谓词,应用于此流的元素
      返回:
      如果流的所有元素都与提供的谓词匹配或流为空,则为true,否则为false
    • noneMatch

      boolean noneMatch(LongPredicate predicate)
      返回此流中没有元素是否都与提供的谓词匹配。如果不需要确定结果,则可能不会对所有元素评估谓词。如果流为空,则返回true,并且不会评估谓词。

      这是一个短路终端操作

      API 注意:
      此方法评估流的元素上的否定谓词的全称量化(对于所有x ~P(x))。如果流为空,则量化被认为是空虚满足,并且始终为true,不管P(x)如何。
      参数:
      predicate - 一个非干扰无状态的谓词,应用于此流的元素
      返回:
      如果流的没有元素与提供的谓词匹配或流为空,则为true,否则为false
    • findFirst

      OptionalLong findFirst()
      返回描述此流的第一个元素的OptionalLong,如果流为空则返回一个空的OptionalLong。如果流没有遇到顺序,则可能返回任何元素。

      这是一个短路终端操作

      返回:
      描述此流的第一个元素的OptionalLong,如果流为空则返回一个空的OptionalLong
    • findAny

      OptionalLong findAny()
      返回描述此流的某个元素的OptionalLong,如果流为空则返回一个空的OptionalLong

      这是一个短路终端操作

      此操作的行为明确是不确定的;它可以自由选择流中的任何元素。这是为了在并行操作中获得最大性能;代价是对相同源的多次调用可能不会返回相同的结果。(如果需要稳定的结果,请改用findFirst()。)

      返回:
      描述此流的某个元素的OptionalLong,如果流为空则返回一个空的OptionalLong
      参见:
    • asDoubleStream

      DoubleStream asDoubleStream()
      返回由此流的元素组成的DoubleStream,转换为double

      这是一个中间操作

      Returns:
      a DoubleStream consisting of the elements of this stream, converted to double
    • boxed

      Stream<Long> boxed()
      Returns a Stream consisting of the elements of this stream, each boxed to a Long.

      This is an intermediate operation.

      返回:
      一个由此流的元素组成的Stream,每个元素都装箱为Long
    • builder

      static LongStream.Builder builder()
      返回一个LongStream的构建器。
      返回:
      一个流构建器
    • empty

      static LongStream empty()
      返回一个空的顺序LongStream
      返回:
      一个空的顺序流
    • of

      static LongStream of(long t)
      返回一个包含单个元素的顺序LongStream
      参数:
      t - 单个元素
      返回:
      一个单例顺序流
    • of

      static LongStream of(long... values)
      返回一个顺序有序流,其元素是指定值。
      参数:
      values - 新流的元素
      返回:
      新流
    • iterate

      static LongStream iterate(long seed, LongUnaryOperator f)
      返回一个无限顺序有序的LongStream,通过将函数f迭代应用于初始元素seed而产生一个Stream,该流由seedf(seed)f(f(seed))等组成。

      LongStream中的第一个元素(位置0)将是提供的seed。对于n > 0,位置n处的元素将是将函数f应用于位置n - 1处的元素的结果。

      对一个元素应用f的操作在对后续元素应用f的操作之前发生。对于任何给定元素,操作可以在库选择的任何线程中执行。

      参数:
      seed - 初始元素
      f - 要应用于前一个元素以产生新元素的函数
      返回:
      一个新的顺序LongStream
    • iterate

      static LongStream iterate(long seed, LongPredicate hasNext, LongUnaryOperator next)
      返回一个顺序有序的LongStream,通过将给定的next函数迭代应用于初始元素,条件是满足给定的hasNext谓词。当hasNext谓词返回false时,流终止。

      LongStream.iterate应该产生与相应的for循环产生的相同序列的元素:

      
           for (long index=seed; hasNext.test(index); index = next.applyAsLong(index)) {
               ...
           }
       

      如果hasNext谓词不在种子值上成立,则生成的序列可能为空。否则,第一个元素将是提供的seed值,下一个元素(如果存在)将是将next函数应用于seed值的结果,依此类推,直到hasNext谓词指示流应终止。

      hasNext谓词应用于一个元素的操作在将next函数应用于该元素的操作之前发生。将next函数应用于一个元素的操作在将hasNext谓词应用于后续元素的操作之前发生。对于任何给定元素,操作可以在库选择的任何线程中执行。

      参数:
      seed - 初始元素
      hasNext - 应用于元素以确定流何时终止的谓词
      next - 要应用于前一个元素以产生新元素的函数
      返回:
      一个新的顺序LongStream
      自:
      9
    • generate

      static LongStream generate(LongSupplier s)
      返回一个无限顺序无序流,其中每个元素由提供的LongSupplier生成。这适用于生成常量流、随机元素流等。
      参数:
      s - 生成元素的LongSupplier
      返回:
      一个新的无限顺序无序LongStream
    • range

      static LongStream range(long startInclusive, long endExclusive)
      返回一个顺序有序的LongStream,从startInclusive(包含)到endExclusive(不包含),步长为1
      API 注意:

      可以使用for循环按顺序生成等价的递增值序列,如下所示:

      
           for (long i = startInclusive; i < endExclusive ; i++) { ... }
       
      参数:
      startInclusive - (包含)的初始值
      endExclusive - 排他性上限
      返回:
      一个long元素范围的顺序LongStream
    • rangeClosed

      static LongStream rangeClosed(long startInclusive, long endInclusive)
      返回一个顺序有序的LongStream,从startInclusive(包含)到endInclusive(包含),步长为1
      API 注意:

      可以使用for循环按顺序生成等价的递增值序列,如下所示:

      
           for (long i = startInclusive; i <= endInclusive ; i++) { ... }
       
      参数:
      startInclusive - (包含)的初始值
      endInclusive - 包含的上限
      返回:
      一个long元素范围的顺序LongStream
    • concat

      static LongStream concat(LongStream a, LongStream b)
      创建一个懒惰连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。如果两个输入流都是有序的,则生成的流是有序的,如果其中一个输入流是并行的,则生成的流是并行的。当结果流关闭时,会调用两个输入流的关闭处理程序。

      此方法操作两个输入流,并将每个流绑定到其源。因此,对输入流源的后续修改可能不会反映在连接的流结果中。

      API 注意:
      为了保留优化机会,此方法将每个流绑定到其源,并仅接受两个流作为参数。例如,如果已知每个输入流源的确切大小,则可以计算连接流源的确切大小。要连接更多流而不绑定,或者不使用此方法的嵌套调用,请尝试创建流的流,并使用恒等函数进行扁平映射,例如:
      
           LongStream concat = Stream.of(s1, s2, s3, s4).flatMapToLong(s -> s);
       
      实现注意:
      构建重复连接的流时要小心。访问深度连接流的元素可能导致深度调用链,甚至StackOverflowError
      参数:
      a - 第一个流
      b - 第二个流
      返回:
      两个输入流的连接