java中flatMap用法完整示例
java中map是把集合每個元素重新映射,元素個數(shù)不變,但是元素值發(fā)生了變化。而flatMap從字面上來說是壓平這個映射,實際作用就是將每個元素進行一個一對多的拆分,細分成更小的單元,返回一個新的Stream流,新的流元素個數(shù)增加。
java官方給出的示例如下:
# 按行讀取文件內容
Stream<String> lines = Files.lines(path);
# 將每一行文字按照空格拆分為單詞
Stream<String> words = lines.flatMap(line -> Stream.of(line.split(" +")));如下所示的文本:
hello world
this is a test txt
done
經過這個轉換,得到的結果如下:
[hello, world, this, is, a, test, txt, done]
我們大概知道,flatMap壓平的作用,就是把原來的三行字符串文字變?yōu)榱艘粋€流,流數(shù)組中每個元素是單詞。
============
我們假設有這樣的需求,有一個[[1,3],[2,4]]的二維數(shù)組,我們要得到一個一維數(shù)組[1,3,2,4]。那么這里的flatMap就正好排上用場,原來是二維的,現(xiàn)在壓平為一維,正好分解了。
List<Integer> lista = new ArrayList<>(); lista.add(1); lista.add(3); List<Integer> listb = new ArrayList<>(); listb.add(2); listb.add(4); List<List<Integer>> listc = new ArrayList<>(); listc.add(lista); listc.add(listb); System.out.println(listc); List<Integer> listd = listc.stream().flatMap(ele -> ele.stream()).collect(Collectors.toList()); System.out.println(listd);
運行程序打印信息如下:
[[1, 3], [2, 4]]
[1, 3, 2, 4]
flatMap里面需要傳入一個Function參數(shù),這里根據(jù)需要將數(shù)組轉為stream。其實可以直接傳入一個函數(shù)名:Collection::stream,效果是一樣的。
完整代碼如下:
package org.example;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class FlatMapExample {
public static void main(String[] args) {
List<Integer> lista = new ArrayList<>();
lista.add(1);
lista.add(3);
List<Integer> listb = new ArrayList<>();
listb.add(2);
listb.add(4);
List<List<Integer>> listc = new ArrayList<>();
listc.add(lista);
listc.add(listb);
System.out.println(listc);
List<Integer> listd = listc.stream().flatMap(Collection::stream).collect(Collectors.toList());
System.out.println(listd);
try {
Stream<String> stream = Files.lines(Paths.get("test.txt"));
// stream.forEach(System.out::println);
List<String> words = stream.flatMap(line -> Stream.of(line.split(" +"))).collect(Collectors.toList());
System.out.println(words);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}運行截圖:

Stream對象經過一次操作之后,內容就會被清除,同時流也被關閉。如果還進行第二次其他操作,那么就會報錯:
stream has already been operated upon or closed
所以進行流操作,一般都是把所有的流程都以鏈式寫法寫在一起,最后得到結果。
總結
到此這篇關于java中flatMap用法的文章就介紹到這了,更多相關java中flatMap用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java之Springcloud Gateway內置路由案例講解
這篇文章主要介紹了Java之Springcloud Gateway內置路由案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08

