一个快速指南,以了解作为支持整数操作的接口IntStream的原始int表示,并附有有用的例子。
1.概述
在本教程中,我们将学习如何在java 8中使用IntStream,以及它在实例程序中的应用。
对于int基元,Java IntStream类是Stream接口的一个特殊化。它是一个原始int值项目的流,可以用于顺序和并行的聚合操作。
AutoCloseable和BaseStream接口是由IntStream实现的,它是java.util.stream包的一部分。
我们将在本课程中学习以下内容。
- 创建IntStream
- ForEach循环
- IntStream的范围
- IntStream最小和最大
- IntStream查找
- IntStrem map
- 筛选
- IntStream distinct
- IntStream到数组
- IntStream to List
2.创建IntStream
IntStream可以通过多种方式生成,但不能用new关键字来创建。
IntStream对象是用下面列出的方法创建的。
- IntStream.of()
- IntStream.range()
- IntStream.rangeclosed()
- IntStream.generate()
- IntStream.iterate()
让我们通过实例程序来探索使用这些方法的方法。 创建一个具有原始int值的IntStream实例。
2.1 IntStream.of()
这个函数返回一个以所提供的值为元素的顺序排列的流。
它有两种形式:单元素流和多值流。
IntStream of(int t) - 返回一个由单一元素组成的流。
IntStream of(int... values)- 返回一个包含所有提供的元素的流。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | package com.javaprogramto.java8.intstream;
import java.util.stream.IntStream;
public class IntStreamOf {
public static void main(String[] args) {
IntStream singleValue = IntStream.of(10);
IntStream multipleValeus = IntStream.of(1, 5, 10, 20, 30);
}
}
|
2.2 IntStream.range()
range() 用于按顺序生成数字,并以1为单位递增。
static IntStream range(int startInclusive, int endExclusive) - 这里的结束范围是独占的。
1 | IntStream range10to30 = IntStream.range(10, 20);
|
2.3 IntStream.rangeclosed()
**rangeClosed()**也用于以逐一递增的方式产生数字,但它包括此方法的结束索引。
静态IntStream rangeClosed(int startInclusive, int endInclusive)
1 | IntStream range10to15closed = IntStream.range(10, 15);
|
2.4 IntStream.generate()
如果你想用自定义逻辑生成随机数,请使用generate()方法。
1 | IntStream random = IntStream.generate( () -> { return (int) Math.random() * 5000;});
|
2.5 IntStream.iterate()
iterate()方法与generate()方法相同,只是它不使用随机值,而是对大数值使用递增或递减的自定义逻辑。
由于iterate()方法生成的是一个无限的整数流,你必须使用limit()函数来获得前n个数字。
1 | IntStream iterate = IntStream.iterate(1000, i -> i + 4000).limit(5);
|
3.IntStream forEach()
通常情况下,我们可以使用传统的for循环来处理某些范围。然而,同样的事情也可以通过使用**IntStream.forEach()**函数来代替完成。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package com.javaprogramto.java8.intstream;
import java.util.stream.IntStream;
public class IntStreamOf {
public static void main(String[] args) {
System.out.println("for loop");
for(int i = 1000; i < 20000 ; i = i + 4000) {
print(i);
}
System.out.println("intstream foreach loop");
IntStream iterate = IntStream.iterate(1000, i -> i + 4000).limit(5);
iterate.forEach(n -> print(n));
}
private static void print(int n) {
System.out.println(n);
}
}
|
4.IntStream范围
IntStream API提供了两种方法来处理在定义范围内生成的数字。
range(start, endExclusive): 从输出范围中排除末端索引。
rangeClosed(start, endInclusive): 这个方法包括输出范围的结束指数。
下面的程序输出让你清楚地了解range()和rangeClosed()方法。
1 2 3 4 5 | IntStream range10to15range = IntStream.range(10, 15);
IntStream range10to15closed = IntStream.rangeClosed(10, 15);
System.out.println("range(10, 15) : "+Arrays.toString(range10to15range.toArray()));
System.out.println("rangeClosed(10, 15) : "+Arrays.toString(range10to15closed.toArray()));
|
输出。
1 2 | range(10, 15) : [10, 11, 12, 13, 14]
rangeClosed(10, 15) : [10, 11, 12, 13, 14, 15]
|
5.IntStream min和max
IntStream有实用的方法来确定一系列数字或随机数字的最小值和最大值。
**使用min()**方法从int stream中检索最低值。
**使用max()**方法从int流中获取最高值。
1 2 | System.out.println("range(10, 15) min value : "+IntStream.range(10, 15).min().getAsInt());
System.out.println("range(10, 15) max value : "+IntStream.range(10, 15).max().getAsInt());
|
输出。
1 2 | range(10, 15) min value : 10
range(10, 15) max value : 14
|
6.IntStream查找值
在InstStream对象上使用**findFirst()或findAny()**方法来获取第一个或任何一个值。
findFirst()与findAny()的深入比较
默认情况下,IntStream被创建为顺序流,除非对IntStream调用parallel()。
对于顺序流,findFirst()和findAny()方法返回相同的结果。然而,如果流是并行的,findAny()方法会给出一个随机值。
1 2 3 4 | System.out.println("findFirst value : "+IntStream.iterate(10, i -> i + 2).limit(100).findFirst().getAsInt());
System.out.println("findAny value : "+IntStream.iterate(10, i -> i + 2).limit(100).findAny().getAsInt());
System.out.println("parallel findAny value : "+IntStream.iterate(10, i -> i + 2).limit(100).parallel().findAny().getAsInt());
|
输出。
1 2 3 | findFirst value : 10
findAny value : 10
parallel findAny value : 160
|
7.IntStream map() 或 flatMap()
我们可以使用**map()方法将IntStream转换为新的形式,但flatMap()**方法将IntStream平铺为基元。
**map()和flatMap()**的使用与IntStream的使用没有太大的区别。
01 02 03 04 05 06 07 08 09 10 11 12 | IntStream mapInput = IntStream.iterate(10, i -> i + 1).limit(10);
System.out.println("map input stream : "+Arrays.toString(mapInput.toArray()));
IntStream mapOutput = mapInput.map( i -> i * 2);
System.out.println("map Output stream : "+Arrays.toString(mapOutput.toArray()));
IntStream input1 = IntStream.iterate(10, i -> i + 1).limit(10);
System.out.println("flat map : "+Arrays.toString(input1.flatMap( i -> IntStream.of(i)).toArray()));
|
输出。
1 2 3 | map input stream : [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
map Output stream : [20, 22, 24, 26, 28, 30, 32, 34, 36, 38]
flat map : [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
|
8.IntStream filter
使用filter()方法,根据给定的IntPredicate条件过滤整数值。
应用**filter()方法后,接下来你可以调用forEach()**或collect()方法将其转换为List或Set。
01 02 03 04 05 06 07 08 09 10 11 | IntStream stream = IntStream.range(100, 200);
System.out.println("numbers divisible by 5 and 7 are : ");
stream.filter(i -> (i % 5 == 0 && i % 7 == 0)).forEach(System.out::println);
IntStream stream2 = IntStream.range(100, 200);
List<Integer> primes = stream2.filter(IntStreamOf::checkPrime).boxed().collect(Collectors.toList());
System.out.println("Prime numbers (100, 200) are "+primes);
|
输出。
1 2 3 4 5 | numbers divisible by 5 and 7 are :
105
140
175
Prime numbers (100, 200) are [101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]
|
9.IntStream distinct()
使用**distinct()**方法从IntStream中删除重复的值。
1 | Arrays.toString(IntStream.of(1, 2, 3, 1, 2, 3).distinct().toArray());
|
输出。
10.IntStream到数组和列表或集合
**使用toArray()**方法将IntStream的输出收集到数组中。
**使用collect()**方法将IntStream的输出收集到List或Set中。
为了从Int Stream中删除重复的数据,你可以将结果收集到Set中,而不是使用distinct()方法。但建议使用distinct()方法。
1 2 3 4 5 6 7 8 9 | int[] intArray = IntStream.of(1, 2, 3, 1, 2, 3).toArray();
System.out.println("int array : "+Arrays.toString(intArray));
List<Integer> list = IntStream.of(1, 2, 3, 1, 2, 3).boxed().collect(Collectors.toList());
System.out.println("IntStream to List : "+list);
Set<Integer> set = IntStream.of(1, 2, 3, 1, 2, 3).boxed().collect(Collectors.toSet());
System.out.println("IntStream to Set : "+set);
|
11.总结
在这篇文章中,我们已经看到了IntStream的所有有用的方法和有用的例子。
GitHub
IntStream API