Stream
主要用于对象类型的集合,幸运的是,JDK还提供了基本类型的Stream,这让我们可以直接使用IntStream
,而不是Stream<Integer>
。
1 算术操作
我们经常会用求最小值、最大值、和、平均数等常用的操作,就以此为例开始吧:
int[] integers = new int[]{20, 98, 12, 7, 35};
int min = Arrays.stream(integers).min().getAsInt();
我们使用Arrays的stream()方法创建了一个int
类型的stream,通过min()
求出最小值(OptionalInt),最后通过getAsInt()
返回int
的值。
另一个创建IntStream
的方法如下:
int max = IntStream.of(23, 32, 98, 1, 3).max().getAsInt();
同样,求和与平均数都是非常便利的:
int sum = IntStream.of(3, 2, 1).sum();
double avg = IntStream.of(73, 232, 232, 1).average().getAsDouble();
2 范围操作
我们可以基本范围来生成基本类型的Stream,这个在写Unit Tests的时候可真是太方便了。
int sum1 = IntStream.range(1, 10).sum();//return 45
int sum2 = IntStream.rangeClosed(1, 10).sum();//return 55
需要注意range()
和rangeClosed()
的区别,range()
是exclusive最后一个值的,rangeClosed()
是inclusive的。
遍历操作:
IntStream.rangeClosed(1, 5).forEach(System.out::println);
并行操作:
IntStream.rangeClosed(1, 5).parallel().forEach(System.out::println);
3 自动装箱和自动拆箱
有时我们需要将基本类型转化为对应的wrapper类型,就需要用到自动装箱操作:
List<Integer> evenInts = IntStream.rangeClosed(1, 10)
.filter(num -> num % 2 == 0)
.boxed()
.collect(Collectors.toList());
同时,我们也可以将wrapper类型转化为基本类型:
sum = Arrays.asList(1,2,3,4).stream()
.mapToInt( i -> i)
.sum();
4 总结
即使我们比较少会用到基本类型的流,但当我们需要用的时候,它可以提高我们的效率。