【Java教程】Day19-05 函数式编程:Stream——map()操作

在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。常见的应用场景包括数字计算、字符串操作、对象转换等。

  1. map()通过将Function应用到Stream中的每个元素,生成一个新的Stream。

  2. map()方法可以用于将一种类型的元素转换为另一种类型的元素。

  3. 通过链式调用map(),我们可以轻松实现多个元素的转换和处理。

 

在实际开发中,map()是一个非常强大且常用的函数式编程工具,能够大大提高代码的简洁性和可读性。

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值