java中flatMap用法完整示例
java中map是把集合每個(gè)元素重新映射,元素個(gè)數(shù)不變,但是元素值發(fā)生了變化。而flatMap從字面上來(lái)說(shuō)是壓平這個(gè)映射,實(shí)際作用就是將每個(gè)元素進(jìn)行一個(gè)一對(duì)多的拆分,細(xì)分成更小的單元,返回一個(gè)新的Stream流,新的流元素個(gè)數(shù)增加。
java官方給出的示例如下:
# 按行讀取文件內(nèi)容 Stream<String> lines = Files.lines(path); # 將每一行文字按照空格拆分為單詞 Stream<String> words = lines.flatMap(line -> Stream.of(line.split(" +")));
如下所示的文本:
hello world
this is a test txt
done
經(jīng)過(guò)這個(gè)轉(zhuǎn)換,得到的結(jié)果如下:
[hello, world, this, is, a, test, txt, done]
我們大概知道,flatMap壓平的作用,就是把原來(lái)的三行字符串文字變?yōu)榱艘粋€(gè)流,流數(shù)組中每個(gè)元素是單詞。
============
我們假設(shè)有這樣的需求,有一個(gè)[[1,3],[2,4]]的二維數(shù)組,我們要得到一個(gè)一維數(shù)組[1,3,2,4]。那么這里的flatMap就正好排上用場(chǎng),原來(lái)是二維的,現(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);
運(yùn)行程序打印信息如下:
[[1, 3], [2, 4]]
[1, 3, 2, 4]
flatMap里面需要傳入一個(gè)Function參數(shù),這里根據(jù)需要將數(shù)組轉(zhuǎn)為stream。其實(shí)可以直接傳入一個(gè)函數(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); } } }
運(yùn)行截圖:
Stream對(duì)象經(jīng)過(guò)一次操作之后,內(nèi)容就會(huì)被清除,同時(shí)流也被關(guān)閉。如果還進(jìn)行第二次其他操作,那么就會(huì)報(bào)錯(cuò):
stream has already been operated upon or closed
所以進(jìn)行流操作,一般都是把所有的流程都以鏈?zhǔn)綄?xiě)法寫(xiě)在一起,最后得到結(jié)果。
總結(jié)
到此這篇關(guān)于java中flatMap用法的文章就介紹到這了,更多相關(guān)java中flatMap用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot-assembly自定義打包全過(guò)程
這篇文章主要介紹了springboot-assembly自定義打包全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Java遞歸算法經(jīng)典實(shí)例(經(jīng)典兔子問(wèn)題)
本文主要對(duì)經(jīng)典的兔子案例分析,來(lái)進(jìn)一步更好的理解和學(xué)習(xí)java遞歸算法,具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12解決Java原生壓縮組件不支持中文文件名亂碼的問(wèn)題
本篇文章主要介紹了解決Java原生壓縮組件不支持中文文件名亂碼的問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03Java之Springcloud Gateway內(nèi)置路由案例講解
這篇文章主要介紹了Java之Springcloud Gateway內(nèi)置路由案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08詳解使用Spring Security進(jìn)行自動(dòng)登錄驗(yàn)證
本篇文章主要介紹了詳解使用Spring Security進(jìn)行自動(dòng)登錄驗(yàn)證,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09idea每次新打開(kāi)的項(xiàng)目窗口maven都要重新設(shè)置問(wèn)題
這篇文章主要介紹了idea每次新打開(kāi)的項(xiàng)目窗口maven都要重新設(shè)置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Android中Handler引起的內(nèi)存泄露問(wèn)題解決辦法
這篇文章主要介紹了Android中Handler引起的內(nèi)存泄露問(wèn)題解決辦法,本文講解了導(dǎo)致內(nèi)存泄露的情景,并給出了修改后的代碼,需要的朋友可以參考下2015-01-01