0Pricing
Java Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. IntStream 与 LongStream
  2. 范围与聚合操作
  3. 映射到对象流及从对象流映射
  4. 生成基本类型流
← 返回 Java Academy