Java Stream API:使用 mapTo 方法进行流式转换

在 Java 的 Stream API 中,mapTo 系列方法用于将流中的元素转换为特定的原始类型流(如 IntStreamLongStreamDoubleStream)或其他对象流。以下是这些方法的详细说明及示例。

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

 

请登录后发表评论

    没有回复内容