在Java 8引入的Stream API中,map()方法是最常用的转换操作之一。它允许我们将一个Stream的每个元素转换成另一个元素,从而生成一个新的Stream。这种操作通常用于将输入数据类型转换为输出数据类型,或者对每个元素执行某种变换。
1. 什么是map()操作?
map()方法通过将一个函数应用到Stream中的每个元素上,生成一个新的Stream。例如,假设我们有一个数字序列 1, 2, 3, 4, 5,并希望对每个数字进行平方操作。我们可以使用map()方法将每个数字转换成它的平方:
例如,给定序列 [1, 2, 3, 4, 5],我们可以通过map()操作得到 [1, 4, 9, 16, 25]。
数学示例:
假设有一个函数 f(x) = x * x,我们将这个函数应用到每个元素上:
scssf(x) = x * x│┌───┬───┬───┬───┼───┬───┬───┬───┐│ │ │ │ │ │ │ │ │▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼[ 1 2 3 4 5 6 7 8 9 ] --> [ 1 4 9 16 25 36 49 64 81 ]
通过map()方法,我们将原始Stream中的每个元素映射为它的平方值,得到一个新的Stream。
2. 如何使用map()方法?
map()方法接受一个Function接口作为参数。这个Function接口定义了一个apply()方法,它将输入元素转换成目标类型的元素。
示例代码:
javaimport java.util.stream.*;public class Main {public static void main(String[] args) {// 创建Stream并映射每个元素的平方Stream<Integer> s = Stream.of(1, 2, 3, 4, 5);Stream<Integer> s2 = s.map(n -> n * n); // 对每个元素进行平方计算s2.forEach(System.out::println); // 输出结果}}
在这个示例中,我们创建了一个包含整数 1, 2, 3, 4, 5 的Stream,并使用map()方法对每个元素进行平方操作。结果将是 1, 4, 9, 16, 25。
3. map()的核心:Function接口
map()方法的核心是Function接口,它有一个apply()方法,用于将输入元素转换为目标类型。我们可以定义自己的转换逻辑,并通过map()方法将其应用到Stream中的每个元素。
java@FunctionalInterfacepublic interface Function<T, R> {R apply(T t); // 将类型T转换为类型R}
Function接口的apply()方法将输入类型T的元素转换为输出类型R的元素。在map()方法中,T表示Stream中的元素类型,R表示转换后的元素类型。
4. map()的常见应用
map()不仅可以用于数字计算,它也能用于字符串操作、对象转换等多种场景。例如,下面的代码使用map()将一个字符串列表中的每个字符串去掉空格,并转换为小写:
示例代码:
javaimport java.util.*;import java.util.stream.*;public class Main {public static void main(String[] args) {// 创建一个包含不同格式字符串的列表List.of(" Apple ", " pear ", " ORANGE", " BaNaNa ").stream().map(String::trim) // 去除空格.map(String::toLowerCase) // 转换为小写.forEach(System.out::println); // 打印结果}}
输出结果为:
applepearorangebanana
在这个示例中,我们使用了两次map()操作:第一次去除每个字符串的空格,第二次将字符串转换为小写。通过这种链式操作,我们可以非常简洁地处理每个元素。
5. 练习:将String转换为LocalDate
使用map()将一组字符串转换为LocalDate对象,并打印输出。以下是实现代码:
示例代码:
javaimport java.util.*;import java.util.stream.*;import java.time.LocalDate;import java.time.format.DateTimeFormatter;public class Main {public static void main(String[] args) {List<String> dates = List.of("2024-01-01", "2024-02-15", "2024-03-30");dates.stream().map(date -> LocalDate.parse(date, DateTimeFormatter.ISO_DATE)) // 将字符串转为LocalDate.forEach(System.out::println); // 打印转换后的日期}}
输出结果为:
yaml2024-01-012024-02-152024-03-30
在这个练习中,我们使用map()将每个字符串按ISO格式转换为LocalDate对象,展示了map()操作在日期转换中的应用。
6. 小结
map()方法是Stream API中最常用的操作之一,它允许我们将Stream中的每个元素转换为另一个元素,并返回一个新的Stream。常见的应用场景包括数字计算、字符串操作、对象转换等。
-
map()通过将Function应用到Stream中的每个元素,生成一个新的Stream。 -
map()方法可以用于将一种类型的元素转换为另一种类型的元素。 -
通过链式调用
map(),我们可以轻松实现多个元素的转换和处理。
在实际开发中,map()是一个非常强大且常用的函数式编程工具,能够大大提高代码的简洁性和可读性。
85

被折叠的 条评论
为什么被折叠?



