ZetCode

Java Stream mapToInt

最后修改于 2025 年 5 月 25 日

本文演示了如何使用 Java Stream 的 mapToInt 方法将对象转换为流中的原始 int 值。

mapToInt 方法是 Java Stream 中的一个中间操作,它将对象流转换为 IntStream,这是一种专门处理原始 int 值的流。 当执行数值运算时,这种转换尤其有益,因为它消除了与装箱和拆箱相关的开销,从而提高了性能。

通过使用 mapToInt,开发人员可以有效地以函数式编程风格处理数值数据,同时利用 IntStream 中可用的优化方法,例如 sumaveragemaxmin。 由于原始流避免了创建不必要的包装器对象,因此它们有助于减少内存消耗并提高数据密集型应用程序中的执行速度。

基本的 mapToInt 语法

mapToInt 方法将流的每个元素转换为原始 int,从而产生一个 IntStream 以进行高效的数值运算。

IntStream mapToInt(ToIntFunction<? super T> mapper)

mapper 函数将每个流元素转换为一个 int。 生成的 IntStream 提供了专门用于数值运算的方法,如 sumaverageminmax

将字符串转换为长度

您可以使用 mapToInt 将字符串流转换为它们的长度作为原始 int 值。

Main.java
void main() {

    Stream.of("apple", "banana", "cherry", "date")
          .mapToInt(String::length)
          .forEach(System.out::println);
}

此示例将字符串流转换为它们的长度作为原始 int。 方法引用 String::length 用作 mapper 函数。

$ java Main.java
5
6
6
4

求和值

mapToInt 方法允许您使用 IntStream 的专用方法在单个管道中转换和求和值。

Main.java
void main() {

    int total = Stream.of("2", "5", "3", "8")
                     .mapToInt(Integer::parseInt)
                     .sum();
    
    System.out.println("Sum: " + total);
}

此示例将字符串解析为整数,并使用 IntStream 的 sum 方法计算它们的总和,该方法在常规 Streams 上不可用。

$ java Main.java
Sum: 18

使用自定义对象

您可以通过将每个对象映射到其一个整数属性来从自定义对象中提取 int 值。

Main.java
record Product(String name, int price) {
}

void main() {

    Stream.of(
            new Product("Laptop", 999),
            new Product("Phone", 699),
            new Product("Tablet", 349)
        )
        .mapToInt(Product::price)
        .average()
        .ifPresent(avg -> System.out.printf("Average price: $%.2f%n", avg));
}

此示例从 Product 对象中提取价格,并使用 IntStream 的 average 方法计算平均值,该方法返回一个 OptionalDouble

$ java Main.java
Average price: $682.33

过滤和映射

您可以结合过滤和 mapToInt 来仅处理特定元素,然后执行数值运算。

Main.java
void main() {

    Stream.of("1", "two", "3", "four", "5")
          .filter(s -> s.matches("\\d+")) // Only numeric strings
          .mapToInt(Integer::parseInt)
          .max()
          .ifPresent(max -> System.out.println("Max value: " + max));
}

此示例过滤非数字字符串,将剩余的字符串转换为 int,并使用 IntStream 的 max 方法查找最大值。

$ java Main.java
Max value: 5

处理空值

映射到 int 时,处理潜在的空值以避免转换期间的异常非常重要。

Main.java
void main() {

    Stream.of("10", null, "20", "30", null)
          .filter(s -> s != null)
          .mapToInt(Integer::parseInt)
          .forEach(System.out::println);
}

此示例显示了如何在转换为 int 之前处理空值。 尝试直接映射 null 将导致 NullPointerException

$ java Main.java
10
20
30

转换回对象流

您可以使用 mapToObj 方法将 IntStream 转换回常规的对象 Stream。

Main.java
void main() {

    IntStream.rangeClosed(1, 5)
             .mapToObj(i -> "Number " + i)
             .forEach(System.out::println);
}

此示例展示了如何使用 mapToObjIntStream 转换回常规的对象 Stream,从而完成原始流和对象流之间的循环。

$ java Main.java
Number 1
Number 2
Number 3
Number 4
Number 5

来源

Java Stream mapToInt 文档

在本文中,我们探讨了 Java Stream 的 mapToInt 方法。 它提供了一种在流中处理原始 int 值的有效方法,提供性能优势和专门的数值运算。 了解何时使用原始流对于编写高效的 Java 代码非常重要。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程