Java Stream mapToInt
最后修改于 2025 年 5 月 25 日
本文演示了如何使用 Java Stream 的 mapToInt 方法将对象转换为流中的原始 int 值。
mapToInt 方法是 Java Stream 中的一个中间操作,它将对象流转换为 IntStream
,这是一种专门处理原始 int
值的流。 当执行数值运算时,这种转换尤其有益,因为它消除了与装箱和拆箱相关的开销,从而提高了性能。
通过使用 mapToInt
,开发人员可以有效地以函数式编程风格处理数值数据,同时利用 IntStream
中可用的优化方法,例如 sum
、average
、max
和 min
。 由于原始流避免了创建不必要的包装器对象,因此它们有助于减少内存消耗并提高数据密集型应用程序中的执行速度。
基本的 mapToInt 语法
mapToInt
方法将流的每个元素转换为原始 int,从而产生一个 IntStream
以进行高效的数值运算。
IntStream mapToInt(ToIntFunction<? super T> mapper)
mapper 函数将每个流元素转换为一个 int。 生成的 IntStream
提供了专门用于数值运算的方法,如 sum
、average
、min
和 max
。
将字符串转换为长度
您可以使用 mapToInt
将字符串流转换为它们的长度作为原始 int 值。
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 的专用方法在单个管道中转换和求和值。
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 值。
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
来仅处理特定元素,然后执行数值运算。
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 时,处理潜在的空值以避免转换期间的异常非常重要。
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。
void main() { IntStream.rangeClosed(1, 5) .mapToObj(i -> "Number " + i) .forEach(System.out::println); }
此示例展示了如何使用 mapToObj
将 IntStream
转换回常规的对象 Stream,从而完成原始流和对象流之间的循环。
$ java Main.java Number 1 Number 2 Number 3 Number 4 Number 5
来源
在本文中,我们探讨了 Java Stream 的 mapToInt
方法。 它提供了一种在流中处理原始 int 值的有效方法,提供性能优势和专门的数值运算。 了解何时使用原始流对于编写高效的 Java 代码非常重要。
作者
列出所有Java教程。