在 Java 的 Stream API 中,mapTo 系列方法用于将流中的元素转换为特定的原始类型流(如 IntStream、LongStream、DoubleStream)或其他对象流。以下是这些方法的详细说明及示例。
1. mapToInt 方法
功能:将流中的每个元素转换为 int 值,生成一个 IntStream。
示例:
import java.util.*;
import java.util.stream.*;
public class MapToExample {
public static void main(String[] args) {
// 示例 1: mapToInt
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
IntStream nameLengths = names.stream().mapToInt(String::length);
System.out.println("mapToInt 示例 (名字长度): " + Arrays.toString(nameLengths.toArray()));
}
}输出:
[5, 3, 7]
解释:mapToInt 将 names 列表中的每个字符串转换为其长度(int 类型)。
2. mapToLong 方法
功能:将流中的每个元素转换为 long 值,生成一个 LongStream。
示例:
import java.util.*;
import java.util.stream.*;
public class MapToExample {
public static void main(String[] args) {
// 示例 2: mapToLong
List<Double> prices = Arrays.asList(19.99, 9.99, 29.99, 39.99);
LongStream roundedPrices = prices.stream().mapToLong(Double::longValue);
System.out.println("mapToLong 示例 (四舍五入后的价格): " + Arrays.toString(roundedPrices.toArray()));
}
}输出:
[19, 9, 29, 39]
解释:mapToLong 将 prices 列表中的每个 Double 值转换为 long 类型(截断小数部分)。
3. mapToDouble 方法
功能:将流中的每个元素转换为 double 值,生成一个 DoubleStream。
示例:
import java.util.*;
import java.util.stream.*;
public class MapToExample {
public static void main(String[] args) {
// 示例 3: mapToDouble
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
DoubleStream squareRoots = numbers.stream().mapToDouble(Math::sqrt);
System.out.println("mapToDouble 示例 (平方根): " + Arrays.toString(squareRoots.toArray()));
}
}输出:
[1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979]
解释:mapToDouble 将 numbers 列表中的每个整数转换为其平方根(double 类型)。
4. mapToObj 方法(与 IntStream 结合)
功能:将 IntStream 中的每个 int 元素转换为对象,生成一个 Stream<U>。
示例:
import java.util.*;
import java.util.stream.*;
public class MapToExample {
public static void main(String[] args) {
// 示例 4: mapToObj 与 IntStream
IntStream range = IntStream.range(1, 4); // 生成 1, 2, 3
Stream<String> rangeStrings = range.mapToObj(Integer::toHexString);
System.out.println("mapToObj 与 IntStream 示例 (十六进制): " + rangeStrings.collect(Collectors.toList()));
}
}输出:
["1", "2", "3"]
解释:mapToObj 将 IntStream 中的每个 int 值转换为其十六进制字符串表示。
5. mapToObj 方法(与 LongStream 结合)
功能:将 LongStream 中的每个 long 元素转换为对象,生成一个 Stream<U>。
示例:
import java.util.*;
import java.util.stream.*;
public class MapToExample {
public static void main(String[] args) {
// 示例 5: mapToObj 与 LongStream
LongStream longValues = LongStream.of(100000L, 200000L, 300000L);
Stream<String> longToString = longValues.mapToObj(String::valueOf);
System.out.println("mapToObj 与 LongStream 示例 (字符串): " + longToString.collect(Collectors.toList()));
}
}输出:
["100000", "200000", "300000"]
解释:mapToObj 将 LongStream 中的每个 long 值转换为其字符串表示。
6. mapToObj 方法(与 DoubleStream 结合)
功能:将 DoubleStream 中的每个 double 元素转换为对象,生成一个 Stream<U>。
示例:
import java.util.*;
import java.util.stream.*;
public class MapToExample {
public static void main(String[] args) {
// 示例 6: mapToObj 与 DoubleStream
DoubleStream doubleValues = DoubleStream.of(1.2, 2.5, 3.8);
Stream<String> doubleToString = doubleValues.mapToObj(d -> String.format("%.1f", d));
System.out.println("mapToObj 与 DoubleStream 示例 (格式化字符串): " + doubleToString.collect(Collectors.toList()));
}
}输出:
["1.2", "2.5", "3.8"]
解释:mapToObj 将 DoubleStream 中的每个 double 值格式化为保留一位小数的字符串。
总结
mapTo 系列方法在 Java Stream API 中非常有用,尤其是在处理原始类型流时。它们可以避免自动装箱和拆箱的开销,并提供了灵活的方式将流中的元素转换为不同的类型。通过结合 mapToObj,还可以将原始类型流转换为对象流,进一步扩展了流操作的能力。