java8之数据流Stream的Map和flatMap的区别

本文通过具体案例介绍了Java Stream API中的map与flatMap方法的应用场景及区别。通过对比两种方法处理集合数据的方式,深入理解如何利用这些功能进行高效的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 XML Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.lyzx.day03;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

import org.junit.Test;

/**
 * 复习一下Map和flatMap
 * 关于Map和flatMap的区别
 */
public class T1 {
    private static List<String> words = Arrays.asList("hello world",
                                                       "hello java",
                                                       "hello hello");
    private static List<String> wordList = Arrays.asList("aa","bb","cc");
    
    @Test
    public void test1(){
        words.stream()
             //对words的每一项都做切割操作,把每一个字符串都转换为数组
             //执行完后数据结构如下{["hello","world"],["hello","java"],["hello","hello"]}
             .map(item -> item.split(" "))
             //对每个数组做单独的遍历操作
             .forEach(arr->{
                 for(String item : arr){
                     System.out.println(item);
                 }
             });
    }
    
    @Test
    public void test2(){
        words.stream()
             //把每一项转化为数组包含列表的Stream流
             //然后这个函数把所有的List里面的字符串都取出来放在了一个集合中,这个集合做下一次执行的数据源
             //{"hello","world","hello","java","hello","hello"}
             .flatMap(item->{
                 String[] arr = item.split(" ");
                 return Arrays.asList(arr).stream();
             })
             //根据每一项的HashCode和equals方法做去重操作
             .distinct()
             //打印每一项
             .forEach(item->System.out.println(item));
    }
    
    @Test
    public void test3(){
        wordList.stream()
                //把T1的getCharacter方法应用于wordList的每一项,wordList每一项都是String
                //getCharacter方法的参数也是String,符合函数式接口
                //通过map方法就把wordList的每一项都转换为了存放单个字符(以字符串的形式存放)列表的Stream流即Stream<List<String>>
                .map(T1::getCharacter)
                //对转换后的每一项(List)分别做遍历操作
                .forEach(sm->{
                    sm.forEach(System.out::println);
                });
    }
    
    @Test
    public void test4(){
        wordList.stream()
                .flatMap(T1::getCharacter)
                .distinct()
                .forEach(System.out::println);
    }
    
    public static Stream<String> getCharacter(String str){
        char[] array = str.toCharArray();
        List<String> list = new ArrayList<String>();
        
        for(char item : array){
            list.add(String.valueOf(item));
        }
        Stream<String> stream = list.stream();
        return stream;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值