在 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
,还可以将原始类型流转换为对象流,进一步扩展了流操作的能力。
没有回复内容