文
章
目
录
章
目
录
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());