映射到对象流及从对象流映射
mapToObj 与 mapToInt
映射到对象流及从对象流映射 是 CoddyKit 上的免费 Java Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
两种流的世界
Java 有对象流(Stream<T>)和基本类型流(IntStream 等)。映射方法可以让您在两者之间转换。
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
System.out.println(IntStream.rangeClosed(1, 3).sum());
}
}mapToObj:从基本类型到对象
mapToObj 会将每个基本类型值转换为对象,并生成一个 Stream<T>。
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
List<String> labels = IntStream.rangeClosed(1, 3)
.mapToObj(n -> "item-" + n)
.collect(Collectors.toList());
System.out.println(labels);
}
}mapToInt:从对象到基本类型
mapToInt 会从每个对象中提取一个 int,生成可用于数值聚合的 IntStream。
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> words = List.of("hi", "hello", "hey");
int totalChars = words.stream()
.mapToInt(String::length)
.sum();
System.out.println(totalChars);
}
}boxed:从基本类型到包装类型流
boxed 会将 IntStream 转换为 Stream<Integer>,在收集到 List 之前需要先进行此转换。
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
List<Integer> list = IntStream.rangeClosed(1, 5)
.boxed()
.collect(Collectors.toList());
System.out.println(list);
}
}mapToLong 和 mapToDouble
其他基本类型也遵循相同的模式:mapToLong 和 mapToDouble。
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> prices = List.of("9.99", "19.50", "4.25");
double total = prices.stream()
.mapToDouble(Double::parseDouble)
.sum();
System.out.println(total);
}
}为何 mapToInt 优于 map
在对象流上使用 map 会让元素保持装箱状态。mapToInt 可以使用 sum 和 average 等数值方法,同时避免装箱。
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = List.of(10, 20, 30);
double avg = nums.stream()
.mapToInt(Integer::intValue)
.average()
.getAsDouble();
System.out.println(avg);
}
}往返转换:从对象到 Int 再到对象
您可以在同一条流水线中双向转换:提取数字、进行转换,然后再将其映射回对象。
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> words = List.of("a", "bb", "ccc");
List<String> report = words.stream()
.mapToInt(String::length)
.mapToObj(len -> "len=" + len)
.collect(Collectors.toList());
System.out.println(report);
}
}asLongStream 和 asDoubleStream
在基本类型流内部,您可以扩大类型:asLongStream 和 asDoubleStream 会在改变数值宽度的同时避免装箱。
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
double avg = IntStream.of(1, 2, 3, 4)
.asDoubleStream()
.average()
.getAsDouble();
System.out.println(avg);
}
}收集基本类型结果
要将基本类型值收集到集合中,请先调用 boxed,然后再使用收集器。
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
Set<Integer> evens = IntStream.rangeClosed(1, 10)
.filter(n -> n % 2 == 0)
.boxed()
.collect(Collectors.toSet());
System.out.println(evens);
}
}flatMapToInt
flatMapToInt 会将对象展平为单个 IntStream,适用于每个对象产生多个数字的情况。
import java.util.List;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
List<int[]> rows = List.of(new int[]{1, 2}, new int[]{3, 4});
int sum = rows.stream()
.flatMapToInt(Arrays::stream)
.sum();
System.out.println(sum);
}
}选择合适的映射器
请根据转换方向进行选择:
- 从对象到基本类型:
mapToInt、mapToLong、mapToDouble。 - 从基本类型到对象:
mapToObj或boxed。
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> in = List.of("x", "yy");
String out = in.stream()
.mapToInt(String::length)
.mapToObj(Integer::toString)
.collect(Collectors.joining(","));
System.out.println(out);
}
}快速检查
哪种方法可以将 IntStream 转换为 Stream<Integer>?
回顾
您已经在对象流和基本类型流之间进行了转换:
mapToInt/mapToLong/mapToDouble将对象流转换为基本类型流。mapToObj和boxed将基本类型流转换为对象流。flatMapToInt会将多个数字展平为一个 IntStream。- 转换为基本类型流后,可以在不装箱的情况下使用数值聚合操作。
常见问题解答
「映射到对象流及从对象流映射」课时是免费的吗?
是的 — 「映射到对象流及从对象流映射」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「映射到对象流及从对象流映射」这节课中我会学到什么?
mapToObj 与 mapToInt 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「映射到对象流及从对象流映射」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- IntStream 与 LongStream
- 范围与聚合操作
- 映射到对象流及从对象流映射
- 生成基本类型流