武漢公司網(wǎng)站建設(shè)高端網(wǎng)站建設(shè)哪家便宜
? ? java中map是把集合每個(gè)元素重新映射,元素個(gè)數(shù)不變,但是元素值發(fā)生了變化。而flatMap從字面上來說是壓平這個(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)過這個(gè)轉(zhuǎn)換,得到的結(jié)果如下:
[hello, world, this, is, a, test, txt, done]
? ? 我們大概知道,flatMap壓平的作用,就是把原來的三行字符串文字變?yōu)榱艘粋€(gè)流,流數(shù)組中每個(gè)元素是單詞。?
? ? ============
? ? 我們假設(shè)有這樣的需求,有一個(gè)[[1,3],[2,4]]的二維數(shù)組,我們要得到一個(gè)一維數(shù)組[1,3,2,4]。那么這里的flatMap就正好排上用場(chǎng),原來是二維的,現(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)過一次操作之后,內(nèi)容就會(huì)被清除,同時(shí)流也被關(guān)閉。如果還進(jìn)行第二次其他操作,那么就會(huì)報(bào)錯(cuò):
stream has already been operated upon or closed?
? ? ?所以進(jìn)行流操作,一般都是把所有的流程都以鏈?zhǔn)綄懛▽懺谝黄?#xff0c;最后得到結(jié)果。