Java IntStream详解

后端 潘老师 6个月前 (10-27) 137 ℃ (0) 扫码查看

Java的IntStream类是一种特殊的Stream,主要用来对int数据进行相关的stream操作。它是包含原始int值元素的流,并且支持顺序有序和并行聚合操作。

IntStream是java.util.stream包的一部分,并实现了AutoCloseable和BaseStream接口。

类似的还有LongStream和DoubleStream,这里我们仅以IntStream来进行讲解。

1.创建IntStream

有几种创建IntStream的方法。

1.1使用指定值创建

此函数返回一个顺序有序流,其元素是指定的值。

它有两个重载方法,支持返回单个元素流和多个元素流。

  • of(int t)的IntStream – 返回包含单个指定元素的流。
  • of(int… values)的IntStream – 返回包含所有指定元素的流。
IntStream.of(10);         //10
IntStream.of(1, 2, 3);     //1,2,3

1.2在范围内生成int流

由range()方法生成的IntStream是顺序有序的int值流,它是for循环中递增的int值的等效序列,并且值默认递增1。此类支持两种方法。

  • range(int start, int end) – 返回从start(含)到end(不含)的顺序有序int流,步长为1。
  • rangeClosed(int start, int end) – 返回从start(含)到end(含)的顺序有序int流,步长为1。
IntStream.range(1, 5);      //1,2,3,4
IntStream.rangeClosed(1, 5);      //1,2,3,4,5

1.3使用迭代创建无限流

iterator()函数对于创建无限流非常有用。此外,我们可以使用此方法产生以任何值递增的流。

以下示例产生前10个从0开始的偶数(即以2递增)。

IntStream.iterate(0, i -> i + 2).limit(10);
//0,2,4,6,8,10,12,14,16,18

1.4使用IntSupplier创建无限流

generate()方法看起来很像iterator(),但是不是通过递增前一个值来计算int值。相反,提供了一个IntSupplier,这是一个函数式接口,用于生成无限的无序int流。

以下示例创建包含10个随机数的流,然后在控制台上打印它们。

IntStream stream = IntStream
    .generate(() -> { return (int)(Math.random() * 10000); });
stream.limit(10).forEach(System.out::println);

2.遍历值

要循环遍历元素,IntStream支持forEach()操作。

IntStream.rangeClosed(0, 4)
            .forEach( System.out::println );

3.过滤值

我们可以对int值流产生的int值进行过滤,并在另一个函数中使用它们或收集它们以进行进一步处理。例如,我们可以迭代int值并过滤/收集某个范围内的所有素数。

IntStream stream = IntStream.range(1, 100);
List<Integer> primes = stream.filter(ThisClass::isPrime)
            .boxed()
            .collect(Collectors.toList());
public static boolean isPrime(int i)
{
    IntPredicate isDivisible = index -> i % index == 0;
    return i > 1 && IntStream.range(2, i).noneMatch(isDivisible);
}

4.将IntStream转换为数组

使用IntStream.toArray()方法将IntStream流转换为int数组。

int[] intArray = IntStream.of(1, 2, 3, 4, 5).toArray();

5.将IntStream转换为List

Java中的集合不能直接存储原始值,只能存储实例/对象。

使用IntStream的boxed()方法,我们可以获得一个包装对象的流,该流可以使用Collectors方法进行收集。

List<Integer> list = IntStream.of(1,2,3,4,5)
            .boxed()
            .collect(Collectors.toList());

版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10420.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】