0Pricing
Java Academy · 课时

映射到对象流及从对象流映射

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

此课程中的所有课时

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