Java IntStream详解

IT 文章2年前 (2023)发布 小编
0 0 0

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

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

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

ad

程序员导航

优网导航旗下整合全网优质开发资源,一站式IT编程学习与工具大全网站

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。此类支持两种方法。

ad

AI 工具导航

优网导航旗下AI工具导航,精选全球千款优质 AI 工具集

  • 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值并过滤/收集某个范围内的所有素数。

ad

免费在线工具导航

优网导航旗下整合全网优质免费、免注册的在线工具导航大全

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());
© 版权声明

相关文章

暂无评论

暂无评论...