精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

會(huì)用flatMap?瞧高手如何用它簡(jiǎn)化代碼!

開(kāi)發(fā) 開(kāi)發(fā)工具
flatMap是函數(shù)式編程中的強(qiáng)大工具,它突破了傳統(tǒng)迭代與嵌套循環(huán)的思維局限。通過(guò)“先映射后扁平化”的操作,它能優(yōu)雅處理嵌套數(shù)據(jù)、集合轉(zhuǎn)換及異步流等復(fù)雜場(chǎng)景。

環(huán)境:Java21

1. 簡(jiǎn)介

flatMap是函數(shù)式編程中的強(qiáng)大工具,它突破了傳統(tǒng)迭代與嵌套循環(huán)的思維局限。通過(guò)“先映射后扁平化”的操作,它能優(yōu)雅處理嵌套數(shù)據(jù)、集合轉(zhuǎn)換及異步流等復(fù)雜場(chǎng)景。無(wú)論是從多層結(jié)構(gòu)中提取信息、合并多個(gè)集合,還是在響應(yīng)式編程中展開(kāi)并整合數(shù)據(jù)流,flatMap都能以簡(jiǎn)潔的鏈?zhǔn)秸{(diào)用實(shí)現(xiàn)。掌握它,意味著代碼將告別冗余的循環(huán)與條件判斷,轉(zhuǎn)向更清晰、更具表達(dá)力的轉(zhuǎn)換邏輯。

本篇文章將詳細(xì)的介紹flatMap函數(shù)的各種場(chǎng)景下的使用。

2.實(shí)戰(zhàn)案例

2.1 flatMap基礎(chǔ)用法

假設(shè)你有一個(gè)List<List<String>>,而你想要得到一個(gè)包含所有字符串的單一列表。大多數(shù)開(kāi)發(fā)者會(huì)在這里使用flatMap,如下示例:

List<List<String>> names = List.of(
  List.of("張三", "李四"),
  List.of("曹查理", "大衛(wèi)"),
  List.of("女?huà)z", "Jerry")
);
// 使用流(Stream)將嵌套的列表展平為一個(gè)單一的字符串列表
List<String> flattened = names.stream()
  .flatMap(List::stream)  // 將每個(gè)子列表中的元素“拉平”到一個(gè)流中
  .toList();  // 收集結(jié)果為一個(gè)新列表
// 輸出展平后的結(jié)果
System.out.println(flattened);

輸出結(jié)果

[張三, 李四, 曹查理, 大衛(wèi), 女?huà)z, Jerry]

這是最基礎(chǔ)用法。我們沒(méi)有得到一個(gè)Stream<List<String>>,而是將其“扁平化”成了一個(gè)單一的Stream<String>。

2.2 使用Optional時(shí)的flatMap技巧

如果你正在使用一個(gè)可能存在也可能不存在的數(shù)據(jù)時(shí)。你可能會(huì)用 Optional 來(lái)處理這種情況。但是,如果你需要串聯(lián)多個(gè)操作呢?通常情況下,你會(huì)得到嵌套的Optional<Optional<T>>,這看起來(lái)就很頭大。而這正是flatMap大顯身手的地方。如下示例:

public static void main(String[] args) {
  Optional<String> nameOpt = Optional.of("Spring Boot3實(shí)戰(zhàn)案例200講");
  Optional<Optional<String>> result = nameOpt
      .map(FlatMapDemo2::toUpperCase); // ? 得到嵌套的 Optional
  System.out.println(result);
}
public static Optional<String> toUpperCase(String s) {
  if (s == null || s.isEmpty()) {
      return Optional.empty();
  }
  return Optional.of(s.toLowerCase());
}

輸出結(jié)果

Optional[Optional[spring boot3實(shí)戰(zhàn)案例200講]]

使用flatMap

Optional<String> nameOpt = Optional.of("Spring Boot3實(shí)戰(zhàn)案例200講");
Optional<String> result = nameOpt.flatMap(FlatMapDemo2::toUpperCase) ;
System.err.println(result) ;

輸出結(jié)果

Optional[spring boot3實(shí)戰(zhàn)案例200講]

總結(jié):

  • map:會(huì)對(duì)結(jié)果進(jìn)行包裝,從而產(chǎn)生嵌套結(jié)構(gòu)。
  • flatMap:會(huì)解開(kāi)包裝,保持簡(jiǎn)潔。

2.3 flatMap替代嵌套循環(huán)

嵌套循環(huán),會(huì)損害代碼的可讀性,尤其是在處理多維數(shù)據(jù)時(shí)。而flatMap可以用一種更優(yōu)雅的方式替代它們。

如下示例:兩個(gè)列表的笛卡爾積,假設(shè)你想要生成產(chǎn)品及其所有顏色組合的列表。

List<String> products = List.of("IPad", "IPhone", "Book");
List<String> colors = List.of("黑色", "白色");
List<String> result = products.stream()
  .flatMap(product -> colors.stream()
          .map(color -> product + " - " + color))
  .collect(Collectors.toList());
result.forEach(System.out::println);

輸出結(jié)果

IPad - 黑色
IPad - 白色
IPhone - 黑色
IPhone - 白色
Book - 黑色
Book - 白色

如果不使用flatMap,你就得編寫(xiě)嵌套循環(huán)。而使用flatMap后,代碼會(huì)變得清晰、簡(jiǎn)潔且具有函數(shù)式風(fēng)格。

2.4 flatMap處理API響應(yīng)

在實(shí)際應(yīng)用中,你經(jīng)常需要從可能返回列表、可選字段或嵌套結(jié)構(gòu)的API中獲取數(shù)據(jù)。你可以使用flatMap直接轉(zhuǎn)換并扁平化結(jié)果,而無(wú)需進(jìn)行空值檢查。

如下示例:扁平化API數(shù)據(jù),假設(shè)有一個(gè)User類(lèi),其中包含一個(gè)返回電話(huà)號(hào)碼列表的方法:

public static void main(String[] args) {
  List<User> users = List.of(
      new User("Pack_xg", Arrays.asList("111", "222")),
      new User("pack", Arrays.asList("333")),
      new User("xg", Arrays.asList("444", "555"))
      );
  List<String> result = users.stream()
      .flatMap(user -> user.phones().stream())
      .toList() ;
  System.out.println(result);
}
public static record User(String name, List<String> phones) {}

輸出結(jié)果

[111, 222, 333, 444, 555]

如果你用for循環(huán)實(shí)現(xiàn)此功能,代碼會(huì)顯得臃腫。而借助flatMap,只需一行代碼就能完成轉(zhuǎn)換。

2.5 flatMap + filter:秘密武器

大多數(shù)開(kāi)發(fā)者會(huì)使用filter和map,但很少將它們與flatMap結(jié)合使用。而正是這種結(jié)合能讓你解鎖另一層強(qiáng)大功能。如下示例:提取有效電子郵件地址

List<List<String>> emails = List.of(
    List.of("pack_xg@gmail.com", "www.qq.com"),
    List.of("pack@yahoo.com"),
    List.of("xg@", "xxxooo@qq.com")
);
List<String> result = emails.stream()
    .flatMap(List::stream)
    .filter(email -> email.contains("@") && email.contains("."))
    .toList() ;
System.out.println(result);

輸出結(jié)果

[pack_xg@gmail.com, pack@yahoo.com, xxxooo@qq.com]

我們無(wú)需逐個(gè)驗(yàn)證嵌套列表中的元素,而是可以在一個(gè)操作鏈中完成扁平化、過(guò)濾和收集。

2.6 flatMap與響應(yīng)式結(jié)合

在響應(yīng)式編程(如Reactor、RxJava)、函數(shù)式庫(kù)以及異步處理流程中你同樣可以使用flatMap。如下示例:響應(yīng)式流中的flatMap(Project Reactor)

首先,引入如下依賴(lài):

<dependency>
  <groupId>io.projectreactor</groupId>
  <artifactId>reactor-core</artifactId>
  <version>3.7.11</version>
</dependency>

Flux使用flatMap

Flux<String> users = Flux.just("Pack_xg", "pack", "xg");
users.flatMap(user -> Flux.just(user.toUpperCase(), user.toLowerCase()))
     .subscribe(System.out::println);

輸出結(jié)果

PACK_XG
pack_xg
PACK
pack
XG
xg

在這里,flatMap會(huì)處理每個(gè)用戶(hù),將其擴(kuò)展為兩個(gè)元素(大寫(xiě)形式 + 小寫(xiě)形式),然后將所有內(nèi)容合并為一個(gè)單一的流。

2.7 綜合示例

你需要獲取用戶(hù)數(shù)據(jù);每個(gè)用戶(hù)都有若干訂單;每個(gè)訂單都包含若干產(chǎn)品。而你想要得到一個(gè)扁平化的列表,其中包含所有用戶(hù)購(gòu)買(mǎi)的所有產(chǎn)品的名稱(chēng)。

準(zhǔn)備如下類(lèi):

//商品
public record Product(String name) {}
//訂單
public record Order(List<Product> products) {}
//用戶(hù)
public record User(String name, List<Order> orders) {}

準(zhǔn)備數(shù)據(jù)

List<Product> p1 = List.of(
  new Product("iPhone 15"),
  new Product("AirPods Pro")
);
List<Product> p2 = List.of(
  new Product("MacBook Pro")
);
List<Order> o1 = List.of(
  new Order(p1),
  new Order(p2)
);
User zhangsan = new User("張三", o1);
List<Product> lisiProducts1 = List.of(
  new Product("iPad Air"),
  new Product("Apple Watch")
);
List<Order> o2 = List.of(
    new Order(lisiProducts1)
);
User lisi = new User("李四", o2);
User wangwu = new User("王五", List.of());
// 所有用戶(hù)
List<User> users = List.of(zhangsan, lisi, wangwu) ;

傳統(tǒng)做法

List<String> productNames = new ArrayList<>();
for (User user : users) {
  for (Order order : user.orders()) {
    for (Product product : order.products()) {
      productNames.add(product.name());
    }
  }
}
System.err.println(productNames) ;

使用flatMap

List<String> productNames = users.stream()
  .flatMap(user -> user.orders().stream())
  .flatMap(order -> order.products().stream())
  .map(Product::name)
  .toList() ;

總結(jié):掌握f(shuō)latMap不僅會(huì)讓你的代碼更簡(jiǎn)潔——它還會(huì)改變你的思維方式。你將不再編寫(xiě)那些千篇一律的循環(huán)代碼。

責(zé)任編輯:武曉燕 來(lái)源: Springboot全家桶實(shí)戰(zhàn)案例
相關(guān)推薦

2010-05-05 11:45:20

虛擬化

2024-09-23 10:00:00

代碼Python

2021-06-05 05:11:52

代碼狀態(tài)機(jī)邏輯

2024-08-27 12:45:26

C++代碼

2021-01-12 18:40:58

基尼不純度決策樹(shù)機(jī)器學(xué)習(xí)

2025-04-28 10:13:03

JavaScript數(shù)組代碼

2018-05-17 10:05:24

運(yùn)行iPadPython

2023-12-20 14:48:26

2025-04-07 04:00:00

AngularTypeScript裝飾器

2009-07-22 07:47:00

Scala客戶(hù)代碼

2021-07-19 11:17:21

人工智能AI深度學(xué)習(xí)

2020-10-23 07:05:54

C++開(kāi)發(fā)后端

2015-10-08 10:04:39

Python高手

2021-12-07 11:31:47

Python代碼if…elif…els

2020-02-19 13:11:52

阿里 AI 代碼

2020-02-28 15:33:12

代碼人工智能檢測(cè)

2022-09-03 15:03:36

AndroidGerrit代碼審核

2015-08-10 11:09:09

Python代碼Python

2017-12-26 09:35:33

2017-04-19 08:47:42

AsyncJavascript異步代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美色视频一区二区三区在线观看 | 日韩成人免费在线观看| 久久夜色精品国产噜噜av小说| 午夜成人免费电影| 亚洲国产一区二区三区在线| а√天堂资源在线| 蜜桃久久av| 久久夜色撩人精品| 搡老熟女老女人一区二区| 免费成人高清在线视频| 亚洲国产精品尤物yw在线观看| 欧美尤物一区| 性生活免费网站| 日韩高清一级片| 国内精品视频久久| 精品国产视频在线观看| 一本久久青青| 欧美成人乱码一区二区三区| 日韩一级在线免费观看| 午夜av在线播放| 国产丝袜美腿一区二区三区| 国产欧美亚洲日本| 国产手机av在线| 日本少妇一区二区| 91av国产在线| 欧美极品视频在线观看| 清纯唯美综合亚洲| 亚洲欧美另类国产| 精品无码人妻少妇久久久久久| 天堂综合在线播放| 色视频一区二区| 9久久9毛片又大又硬又粗| 在线免费观看的av| 亚洲视频资源在线| 亚洲日本japanese丝袜| 久久米奇亚洲| www欧美成人18+| 国产午夜精品一区| 成人午夜福利视频| 国产激情视频一区二区三区欧美| 国产久一一精品| а中文在线天堂| 丝袜美腿高跟呻吟高潮一区| 18一19gay欧美视频网站| 欧美日韩亚洲国产另类| 亚洲破处大片| 久久伊人色综合| 亚洲一级二级片| 欧美大人香蕉在线| 日韩亚洲精品电影| 日韩欧美在线视频播放| 久久中文字幕av| 中文字幕国产精品| 人人干在线观看| 欧美国产小视频| 超碰日本道色综合久久综合| 亚洲综合视频网站| 欧美一区综合| 久久久久在线观看| 久久久国产精品成人免费| 99精品热视频只有精品10| 韩国日本不卡在线| 福利网址在线观看| 免费在线观看成人| 国产日韩精品在线| a毛片在线免费观看| 成人一区二区三区视频| 国产伦精品一区二区三| 五月激情婷婷综合| 国产亚洲人成网站| 亚洲人成影视在线观看| av免费网站在线| 亚洲狠狠爱一区二区三区| 欧美久久久久久久久久久久久| 亚洲第一av| 欧美在线免费观看视频| 亚洲无在线观看| 超碰97久久| 亚洲美女动态图120秒| 久久精品三级视频| 亚洲成人精品| 91精品国产九九九久久久亚洲| 日日摸天天添天天添破| 日本sm残虐另类| 99re国产在线播放| 激情综合闲人网| 亚洲天堂精品在线观看| www.av中文字幕| 成人在线网站| 欧美成va人片在线观看| 亚洲一级中文字幕| 国产精品久久久久久久| 韩国日本不卡在线| 亚洲一区中文字幕永久在线| 成人av手机在线观看| 日韩欧美一区二区三区四区| av在线网址观看| 色综合天天性综合| 中文字幕avav| 国产欧美一区| 久久久久久久亚洲精品| 亚洲网站免费观看| 91免费观看视频在线| 日本高清xxxx| 美女色狠狠久久| 亚洲精美色品网站| 色哟哟一一国产精品| 男人天堂欧美日韩| 99国产超薄丝袜足j在线观看| 玖玖综合伊人| 亚洲成人在线观看视频| 日本中文字幕精品—区二区| 图片婷婷一区| 欧美老女人在线视频| 国产精品第6页| 99精品欧美一区二区蜜桃免费 | 国产sm在线观看| 国产一区二区三区四区| 97精品免费视频| 国产视频一二三四区| 中文字幕乱码一区二区免费| 国产美女主播在线播放| 免费观看性欧美大片无片| 尤物99国产成人精品视频| 日本少妇xxxx动漫| 国产精品66部| 在线日韩av永久免费观看| 久久精品女人天堂av免费观看| 精品久久久久99| 国语对白在线播放| 久久成人18免费观看| 日韩av一级大片| 国产超碰精品| 亚洲欧美国产视频| 中文字幕第四页| 久久综合色之久久综合| 黄页免费在线观看视频| heyzo欧美激情| 色综合视频网站| 国产极品久久久| 亚洲婷婷综合久久一本伊一区 | 成人激情动漫在线观看| 今天免费高清在线观看国语| 95精品视频| 久久综合久中文字幕青草 | 精品国产电影一区二区| 亚洲综合网在线| 国产精品一区二区黑丝| 国产成人免费高清视频| 国产美女视频一区二区 | 日韩电影免费观看在| 成人看片网页| 丝袜美腿亚洲一区二区| 一区二区不卡视频在线观看| 国产精品毛片久久久久久久| 男生操女生视频在线观看 | 26uuu国产日韩综合| 国模吧无码一区二区三区| 欧美色图婷婷| 日本亚洲精品在线观看| 国产福利在线看| 欧美日韩激情在线| 91人妻一区二区三区蜜臀| 国产精品2024| 无码人妻精品一区二区三区在线| 九色精品国产蝌蚪| 国产精品盗摄久久久| 免费黄色在线观看| 日韩午夜中文字幕| 日韩欧美三级视频| 国产日韩欧美a| 一区二区三区国产好的精华液| 国自产拍偷拍福利精品免费一| 国产精品区一区二区三在线播放 | 午夜精品久久久久久久久| 少妇毛片一区二区三区| 麻豆视频观看网址久久| 亚洲精品少妇一区二区| 秋霞影院一区二区三区| 国产精品久久久久久久天堂| 成人影院www在线观看| 亚洲福利精品在线| 久草视频在线免费| 亚洲免费观看高清| 亚洲乱码国产乱码精品精大量| 喷白浆一区二区| 91.com在线| 经典一区二区| 97超级在线观看免费高清完整版电视剧| 久久五月精品中文字幕| 国产一区二区三区直播精品电影| 国产熟女一区二区丰满| 色综合久久99| 免费看一级一片| 国产日本一区二区| 日本精品一二三区| 麻豆精品一区二区| 精品无码国产一区二区三区av| 欧美伦理影院| 精品一区二区日本| 久久丁香四色| 国产精品人成电影| 草草视频在线| 久久福利视频导航| 国产黄色在线| 日韩电影中文字幕av| 888奇米影视| 欧美天天综合色影久久精品| 国产av无码专区亚洲av毛网站| 国产欧美一区二区精品久导航| 老司机午夜免费福利| 精品一区二区成人精品| 不卡影院一区二区| 亚洲激情女人| 少妇久久久久久被弄到高潮| 欧美岛国激情| 亚洲丰满在线| 自拍偷拍一区| 精品视频在线观看| 高清精品视频| 亚洲最大的网站| 久久精品国产亚洲av麻豆蜜芽| 亚洲人成网站精品片在线观看 | 黄色一级大片在线免费看国产一| 欧美精品在线观看一区二区| 一级黄色av片| 日韩欧美极品在线观看| 日本一区二区欧美| 亚洲最色的网站| 青青草国产在线观看| 亚洲欧美综合在线精品| 阿v天堂2014| 国产欧美一区二区三区沐欲 | 国产精品美女久久久久aⅴ国产馆| 97人妻精品一区二区免费| 99精品欧美一区| 国产麻豆xxxvideo实拍| 9久草视频在线视频精品| 日韩高清一二三区| 国产成人免费视频网站| 久久久久99人妻一区二区三区 | 久草视频福利在线| 高潮精品一区videoshd| 中文字幕永久免费| 成人综合婷婷国产精品久久| 欧美性开放视频| 国产熟女高潮一区二区三区| 成人av免费在线观看| 日本道中文字幕| 成人动漫中文字幕| 国产人妻黑人一区二区三区| 国产91精品一区二区麻豆亚洲| 又大又长粗又爽又黄少妇视频| 国产精品456露脸| www.com日本| 97久久超碰国产精品电影| 男女一区二区三区| 成人一区在线观看| 免费成人深夜夜行p站| 久久亚洲春色中文字幕久久久| 亚洲色图欧美日韩| 2021中文字幕一区亚洲| 久久视频精品在线观看| 成人免费一区二区三区在线观看| 看免费黄色录像| 午夜精品一区在线观看| 日韩黄色一级大片| 在线免费不卡视频| 国产精品伦理一区| 欧美成人欧美edvon| 日韩偷拍自拍| 亚洲午夜精品久久久久久性色 | 日本一区二区三区四区| 日韩毛片无码永久免费看| 国产精品国产三级国产aⅴ入口| 四虎影院中文字幕| 五月天一区二区三区| 亚洲成人第一网站| 91精品国产色综合久久不卡电影| 精品国产99久久久久久宅男i| 亚洲福利在线看| 成人18在线| 欧美国产日韩一区二区在线观看| 黄视频网站在线观看| 国产欧美日韩免费| 成人激情自拍| 亚洲欧美日韩另类精品一区二区三区 | 欧美大片日本大片免费观看| 午夜成人鲁丝片午夜精品| 怡红院精品视频| 青草av在线| 国产精品xxxxx| 超碰97久久国产精品牛牛| 日韩视频精品| 国内精品美女在线观看| 国产视频手机在线播放| 不卡av在线网| 中文字幕第69页| 精品日本高清在线播放| 国产精品羞羞答答在线| 日韩成人在线视频网站| 黄色网页在线免费看| 日本欧美黄网站| 中文字幕视频精品一区二区三区| 日韩电影大全在线观看| 亚洲毛片播放| 激情图片中文字幕| 日本一区二区三区国色天香| 在线免费观看毛片| 91麻豆精品国产91久久久资源速度| 深夜福利视频在线观看| 久99久在线视频| 日韩毛片免费看| 欧美一级大片在线免费观看| 色悠久久久久综合先锋影音下载 | 国产精品v亚洲精品v日韩精品 | 大地资源网在线观看免费官网| 久久精品系列| www.日本高清| 亚洲综合色噜噜狠狠| 国产精品乱码久久久| 最好看的2019年中文视频| 欧美7777| 久久综合伊人77777麻豆| 精品动漫av| 久久av一区二区三| 亚洲免费资源在线播放| 国产精品无码久久av| 最近的2019中文字幕免费一页| 樱桃视频成人在线观看| 精品国产免费人成电影在线观...| 午夜天堂精品久久久久| 拔插拔插华人永久免费| 国产精品丝袜黑色高跟| 狠狠躁夜夜躁人人爽视频| 亚洲嫩模很污视频| 日韩影院在线| 乱一区二区三区在线播放| 亚洲日产国产精品| 成人区人妻精品一区二| 午夜欧美2019年伦理| 黑人精品一区二区| 欧美—级高清免费播放| 91精品国产自产精品男人的天堂 | 久久66热这里只有精品| 99精品视频网| 在线观看国产免费视频| 欧美日韩免费在线观看| 日韩在线免费看| 国产黑人绿帽在线第一区| 国产99亚洲| youjizzxxxx18| 国产精品美女www爽爽爽| 91麻豆一区二区| 米奇精品一区二区三区在线观看| 欧美国产亚洲精品| 蜜臀精品一区二区| 波多野结衣视频一区| 国产成人自拍视频在线| 日韩三级毛片| 久久天堂电影网| 欧美激情喷水| 一区二区av| 国产传媒日韩欧美成人| 日韩成人免费在线视频| 亚洲欧美www| www.久久99| 欧美午夜性视频| 国产三级久久久| 国产免费的av| 国内免费久久久久久久久久久| 亚洲最大在线| 一区二区三区四区毛片| 亚洲一区免费观看| 激情小视频在线| 亚洲在线www| 亚洲资源av| 99成人在线观看| 精品少妇一区二区三区日产乱码| 色老头在线一区二区三区| 日韩精品久久一区| 国产一区在线视频| 婷婷激情五月网| 色777狠狠综合秋免鲁丝| 97久久精品| 天天操天天爽天天射| 一区二区三区在线视频免费| 你懂得在线网址| 亚洲综合中文字幕在线观看| 午夜一区不卡| 青娱乐在线视频免费观看| 亚洲欧美中文在线视频| 亚洲乱码一区| 国产福利影院在线观看| 亚洲一区在线观看免费| 成人精品一区二区| 国产精品一区视频| 精品一区二区三区av| 特一级黄色大片| 久久中文字幕在线视频|