上一篇介绍了 Stream 的用法,为了简化基本类型流使用,以及消除频繁自动装箱、拆箱的性能损耗,JDK 提供了三种基本类型的流:IntStream、 LongStream、DoubleStream
。本篇将介绍一下 IntStream
中区别于 Stream
的方法。
IntStream
中的元素类型是基本类型的 int
,所以对应的方法参数从 Predicate
、Function
、ToLongFunction
、Consumer
、Supplier
… 变成了 IntPredicate
、IntFunction
、IntToLongFunction
、IntConsumer
、IntSupplier
…,但是用法是一样的,这里不在赘述。
range、rangeClosed
生成一个从 startInclusive 到 endExclusive 的有序的串行流。
- range:[startInclusive, endExclusive)
- rangeClosed:[startInclusive, endExclusive]
public static IntStream range(int startInclusive, int endExclusive);
public static IntStream rangeClosed(int startInclusive, int endInclusive);
public static void range() {
IntStream.range(1, 3).forEach(System.out::println);
System.out.println();
IntStream.rangeClosed(1, 3).forEach(System.out::println);
}
1
2
1
2
3
map
Stream.map()
:Stream<T>
==>Stream<R>
。IntStream.map()
:IntStream
==>IntStream
。IntStream.mapToObj()
:IntStream
==>Stream<U>
。
// Stream.map()
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
IntStream map(IntUnaryOperator mapper);
<U> Stream<U> mapToObj(IntFunction<? extends U> mapper);
public static void map() {
IntStream intStream = IntStream.rangeClosed(1, 3)
.map(operand -> operand * 2);
Stream<String> stringStream = IntStream.rangeClosed(1, 3)
.mapToObj(String::valueOf);
intStream.forEach(System.out::println);
System.out.println();
stringStream.forEach(System.out::println);
}
2
4
6
1
2
3
sum
求和。
public static void sum() {
int sum = IntStream.rangeClosed(1, 3).sum();
System.out.println(sum);
}
6
min、max
求最大、最小值。与 Stream
的方法不同,IntStream
的方法不需要传入比较器。
public static void maxMax() {
OptionalInt min = IntStream.rangeClosed(1, 3).min();
OptionalInt max = IntStream.rangeClosed(1, 3).max();
System.out.println(min);
System.out.println(max);
}
OptionalInt[1]
OptionalInt[3]
average
求平均值。
public static void average() {
OptionalDouble average = IntStream.rangeClosed(1, 4).average();
System.out.println(average);
}
OptionalDouble[2.5]
summaryStatistics
求 count、sum、average、min、max
public static void summaryStatistics() {
IntSummaryStatistics summaryStatistics = IntStream.rangeClosed(1, 4).summaryStatistics();
System.out.println(summaryStatistics);
}
IntSummaryStatistics{count=4, sum=10, min=1, average=2.500000, max=4}
asLongStream、asDoubleStream
转成 LongStream
、DoubleStream
public static void asXxxStream() {
DoubleStream doubleStream = IntStream.rangeClosed(1, 3).asDoubleStream();
LongStream longStream = IntStream.rangeClosed(1, 3).asLongStream();
doubleStream.forEach(System.out::println);
longStream.forEach(System.out::println);
}
1.0
2.0
3.0
1
2
3
boxed
IntStream
转成 Stream<Integer>
public static void boxed() {
IntStream intStream = IntStream.rangeClosed(1, 3);
Stream<Integer> boxed = intStream.boxed();
boxed.forEach(System.out::println);
}
1
2
3