1. 程式人生 > >java8之資料流Stream的Map和flatMap的區別

java8之資料流Stream的Map和flatMap的區別

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;
    }
}