IntStream 与 LongStream
在流中避免装箱
IntStream 与 LongStream 是 CoddyKit 上的免费 Java Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
为何存在基本类型流
Stream<Integer> 会将每个元素都装箱为 Integer 对象。IntStream、LongStream 和 DoubleStream 直接处理基本类型,以避免装箱开销。
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int sum = IntStream.of(1, 2, 3, 4).sum();
System.out.println(sum);
}
}创建 IntStream
对于明确指定的值,请使用 IntStream.of;对于 int[],请使用 Arrays.stream。
import java.util.Arrays;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int[] data = {10, 20, 30};
IntStream s = Arrays.stream(data);
System.out.println(s.max().getAsInt());
}
}用于大数的 LongStream
LongStream 的工作方式与 IntStream 类似,但处理的是 long 值,可以避免大数求和时发生溢出。
import java.util.stream.LongStream;
public class Main {
public static void main(String[] args) {
long total = LongStream.of(1_000_000_000L, 2_000_000_000L).sum();
System.out.println(total);
}
}专用终端操作
基本类型流增加了对象流所没有的数值方法:sum、min、max 和 average。
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntStream nums = IntStream.of(4, 8, 15, 16, 23, 42);
System.out.println(nums.average().getAsDouble());
}
}OptionalInt 结果
min 和 max 返回 OptionalInt,因为流可能为空。请使用 getAsInt 或 orElse。
import java.util.OptionalInt;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
OptionalInt result = IntStream.empty().max();
System.out.println(result.orElse(-1));
}
}map 保持基本类型
IntStream 上的 map 接收一个 IntUnaryOperator,并返回另一个 IntStream,因此不会发生装箱。
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int sumOfSquares = IntStream.of(1, 2, 3)
.map(n -> n * n)
.sum();
System.out.println(sumOfSquares);
}
}基本类型流上的 filter
filter 接收一个 IntPredicate,并保留匹配的基本类型值。
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
long evens = IntStream.of(1, 2, 3, 4, 5, 6)
.filter(n -> n % 2 == 0)
.count();
System.out.println(evens);
}
}IntStream 上的 reduce
reduce 使用 IntBinaryOperator 对流进行折叠。提供初始值时,它会直接返回一个 int。
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int product = IntStream.rangeClosed(1, 5)
.reduce(1, (a, b) -> a * b);
System.out.println(product);
}
}对基本类型使用 forEach
forEach 接收一个 IntConsumer,同样可以避免装箱。
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntStream.of(7, 8, 9).forEach(n -> System.out.println(n));
}
}收集到数组中
toArray 返回基本类型数组 int[],这是 IntStream 的自然对应形式。
import java.util.Arrays;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int[] doubled = IntStream.of(1, 2, 3).map(n -> n * 2).toArray();
System.out.println(Arrays.toString(doubled));
}
}在 Int 与 Long 之间转换
IntStream.asLongStream 会将基本类型扩大为 long,且不会发生装箱。
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
long sum = IntStream.of(1, 2, 3).asLongStream().sum();
System.out.println(sum);
}
}快速检查
与 Stream<Integer> 相比,使用 IntStream 的主要原因是什么?
回顾
您使用基本类型流跳过了装箱:
IntStream和LongStream保存原始基本类型值。- 它们提供了数值型终端操作:
sum、min、max和average。 min和max返回OptionalInt。map、filter、reduce和toArray都会保持基本类型。
常见问题解答
「IntStream 与 LongStream」课时是免费的吗?
是的 — 「IntStream 与 LongStream」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「IntStream 与 LongStream」这节课中我会学到什么?
在流中避免装箱 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「IntStream 与 LongStream」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- IntStream 与 LongStream
- 范围与聚合操作
- 映射到对象流及从对象流映射
- 生成基本类型流