精品欧美一区二区三区在线观看 _久久久久国色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)

亚洲天堂成人在线观看| 国产亚洲精品v| 日韩一区二区三区精品视频| 日韩激情视频一区二区| 无码国精品一区二区免费蜜桃| 久久在线精品| 欧美成人免费全部| ass精品国模裸体欣赏pics| 日本免费在线一区| 亚洲丶国产丶欧美一区二区三区| 日本中文不卡| 蜜臀av在线观看| 日本成人在线不卡视频| 久久久久久91| 美女网站视频色| 精品人人人人| 91精品欧美福利在线观看| 鲁一鲁一鲁一鲁一澡| 免费在线你懂的| 99re这里只有精品视频首页| 91九色蝌蚪国产| 国产亚洲欧美在线精品| 国产综合网站| 视频在线观看99| www.久久av| av日韩在线播放| 91麻豆精品国产自产在线| 国产aaa一级片| 国精一区二区三区| 亚洲日本电影在线| 亚洲国产精品一区在线观看不卡 | 日韩精品成人av| av午夜一区麻豆| 亚洲一区二区三区视频| 日韩国产成人在线| 国产亚洲毛片| 孩xxxx性bbbb欧美| 黄色一级片在线免费观看| 欧美3p在线观看| 亚洲图片欧美午夜| 强伦人妻一区二区三区| 久久人人爽人人爽人人片av不| 91精品国产免费| 亚洲精品综合在线观看| 韩日精品一区| 欧美在线观看18| 精品久久久久久无码国产| 大菠萝精品导航| 亚洲综合清纯丝袜自拍| 中国女人做爰视频| 图片区小说区亚洲| 一级做a爱片久久| 欧美在线观看黄| 欧美人与牲禽动交com| 18成人在线观看| 在线国产精品网| 日韩精品成人av| 综合欧美一区二区三区| 中文字幕超清在线免费观看| 国产区在线观看| 亚洲欧美另类小说视频| 在线无限看免费粉色视频| 欧美激情办公室videoshd| 中文字幕亚洲综合久久菠萝蜜| 伊人久久av导航| 黄色免费在线看| 亚洲欧美日韩国产中文在线| 神马午夜伦理影院| 久草在线视频资源| 欧美日韩国产精品专区| 99精品免费在线观看| 欧美xxxx做受欧美护士| 欧美日韩在线免费视频| www激情五月| 哺乳一区二区三区中文视频| 亚洲精品福利在线观看| 少妇久久久久久久久久| 98精品久久久久久久| 久久久国产精品免费| 欧美激情极品视频| 欧美日韩一区二区在线观看 | 欧美三区视频| 性欧美xxxx视频在线观看| 日产精品久久久| 三级精品在线观看| 国产免费一区视频观看免费 | 日韩成人av网址| 国产全是老熟女太爽了| 欧美gvvideo网站| 色综合久综合久久综合久鬼88| 黄网站免费在线| 久久国产直播| 91pron在线| 欧洲成人av| 亚洲天堂免费在线观看视频| 日韩黄色片在线| 亚洲承认视频| 日韩一级成人av| 免费黄色在线视频| 欧美黄色aaaa| 国产精品大片wwwwww| av片免费播放| 国产色婷婷亚洲99精品小说| 菠萝蜜视频在线观看入口| 欧美一级大黄| 337p日本欧洲亚洲大胆色噜噜| a天堂中文字幕| 一区二区自拍| 91久久久久久久久久| 天堂√在线中文官网在线| 亚洲男人的天堂一区二区| 成人小视频在线看| av成人综合| 久久亚洲综合国产精品99麻豆精品福利| 日本一级黄色录像| 激情欧美日韩一区二区| 欧美人xxxxx| 久久香蕉一区| 91精品国产免费| 亚洲黄色网址大全| 西西人体一区二区| 国产高清精品一区二区| 麻豆系列在线观看| 欧美系列在线观看| 青青草福利视频| 在线视频精品| 国产精品免费一区二区三区| 欧美午夜电影一区二区三区| 色婷婷国产精品久久包臀| 日本wwww色| 香港欧美日韩三级黄色一级电影网站| 国产极品精品在线观看| 午夜成人鲁丝片午夜精品| 一区二区三区 在线观看视频| 免费在线观看污网站| 久久国产电影| 国产免费一区二区三区香蕉精| 成年人视频免费在线观看| 天天av天天翘天天综合网| 在线播放第一页| 欧美精品一卡| wwwxx欧美| 色操视频在线| 日韩欧美中文字幕精品| 在线免费观看亚洲视频| 国产精品影音先锋| 免费的av在线| 亚洲综合影院| 久久久久久久久久久免费| 丰满人妻妇伦又伦精品国产| 亚洲国产欧美日韩另类综合 | 精品精品国产三级a∨在线| 久久久久国产一区二区三区| 亚洲AV午夜精品| 亚洲一区在线观看免费| 日本少妇一级片| 韩日精品在线| 国产精品手机在线| ****av在线网毛片| 精品无人区太爽高潮在线播放| 天堂网一区二区三区| 91免费在线播放| 国产乱子夫妻xx黑人xyx真爽| 免费不卡中文字幕在线| 国产精品九九久久久久久久| 日本在线观看| 日韩一区二区在线观看视频| 国产无码精品久久久| 91一区一区三区| 日韩中文字幕免费在线| 久久看人人摘| 99re在线播放| 极品视频在线| 在线播放日韩专区| 国产免费无遮挡| 亚洲成人av中文| av网站免费在线看| 狠狠色伊人亚洲综合成人| 久久久久久久香蕉| 一区二区三区视频免费观看| 成人福利网站在线观看11| 黄页网站在线| 亚洲色图在线观看| 国产精品无码白浆高潮| 天天影视涩香欲综合网| 久久精品三级视频| 国产99久久久国产精品免费看| 亚欧无线一线二线三线区别| 不卡视频在线| 国产精品.com| 精品久久99| 91成人在线播放| 日韩在线免费电影| 亚洲精品久久久久久久久| 欧美在线视频精品| 亚洲va韩国va欧美va精品| 你懂得视频在线观看| aaa亚洲精品一二三区| 在线观看国产福利| 欧美亚洲一级| 久久久久久久香蕉| 成人在线免费观看视频| 国产激情一区二区三区在线观看 | 秋霞影院一区二区| 97视频在线免费| 99精品综合| 欧美伦理一区二区| 激情视频极品美女日韩| 国产在线98福利播放视频| 成人直播视频| 久久理论片午夜琪琪电影网| 久做在线视频免费观看| 亚洲人精选亚洲人成在线| 国产综合在线播放| 欧美久久久影院| 成年人视频免费| 精品福利在线观看| 久久精品www| 中文字幕日韩av资源站| 国产熟女一区二区| 91丝袜国产在线播放| 午夜视频在线免费看| 麻豆专区一区二区三区四区五区| 欧美牲交a欧美牲交aⅴ免费真 | 免费一区二区三区视频导航| 99国产在线| 高清一区二区| 国产日韩欧美中文在线播放| 99re66热这里只有精品4| 欧美一区在线直播| 9lporm自拍视频区在线| 欧美精品手机在线| 黄色网在线免费观看| 日韩视频在线观看免费| av免费观看一区二区| 伊人久久综合97精品| 撸视在线观看免费视频| 亚洲美女免费精品视频在线观看| 天堂中文在线官网| 亚洲第一福利网| 免费观看毛片网站| 亚洲成av人影院在线观看 | 亚洲欧美日韩区| 日韩有码电影| 亚洲伦理中文字幕| 青梅竹马是消防员在线| 亚洲男人天堂网| 嫩草在线播放| 一区二区三区国产视频| 蝌蚪视频在线播放| 亚洲小视频在线| 男人的天堂在线视频免费观看| 日日狠狠久久偷偷四色综合免费| 秋霞午夜在线观看| 成人97在线观看视频| 在线欧美三级| 性日韩欧美在线视频| 蜜桃av在线播放| 国产成人精品优优av| 欧美国产视频| 97netav| 亲子伦视频一区二区三区| 免费h精品视频在线播放| 国产精品一区2区3区| 性欧美精品一区二区三区在线播放| 青青草91久久久久久久久| 精品国产三级a∨在线| 亚洲一级特黄| 无码少妇一区二区三区芒果| 久久精品国产99久久6| 国产男女无遮挡猛进猛出| www.99精品| 国产一区二区三区精品在线| 亚洲天堂网中文字| 日韩欧美一区二区一幕| 91国偷自产一区二区三区观看| 亚洲天堂网在线观看视频| 日韩一区和二区| 天堂a√中文在线| www国产精品视频| 9999精品成人免费毛片在线看| 国产成人精品久久二区二区| 99精品女人在线观看免费视频| 国产区二精品视| 国内亚洲精品| 激情成人开心网| 免费观看久久久4p| 亚洲一区和二区| 欧美国产一区二区| 久久久久久久久久久久久久久久久| 欧美日韩一区二区精品| 97人妻一区二区精品免费视频| 亚洲国产免费av| 黄网站app在线观看| 欧美影院久久久| 国产精品高清一区二区| 欧美性天天影院| 欧美日韩国产综合网| 校园春色 亚洲色图| 91一区二区在线| 粉嫩av性色av蜜臀av网站| 色偷偷久久人人79超碰人人澡| 国产免费黄色大片| 亚洲跨种族黑人xxx| 日韩精品卡一| 国产精品揄拍500视频| 欧美理伦片在线播放| 中国老女人av| 日本不卡视频在线观看| 在线天堂www在线国语对白| 亚洲男帅同性gay1069| 中文字幕欧美人妻精品| 日韩激情av在线免费观看| 先锋影音在线资源站91| 国产女同一区二区| 九九热爱视频精品视频| 少妇高潮喷水在线观看| 国产一区二区看久久| youjizz亚洲女人| 日韩欧美大尺度| 人妻视频一区二区三区| 欧美激情乱人伦| 成人在线日韩| 美女黄色片网站| 久久国产婷婷国产香蕉| 一区二区三区四区免费| 欧美日韩免费在线观看| 亚洲成人77777| 欧美成在线观看| 激情综合婷婷| 中国 免费 av| 国产一区二区三区在线观看免费 | 国语精品中文字幕| 欧美日一区二区三区在线观看国产免| 五月天中文字幕在线| 国产精品国产自产拍在线| 懂色av蜜臀av粉嫩av喷吹| 亚洲欧洲日本专区| 日韩电影av| 欧美日韩国产不卡在线看| 免费一区视频| 国产全是老熟女太爽了| 91国在线观看| 亚乱亚乱亚洲乱妇| 成人综合国产精品| 在线免费观看日本欧美爱情大片| 奇米视频888| 亚洲精品自拍动漫在线| 亚洲av无码国产综合专区| 美女av一区二区三区| 久久国产精品美女| 国产小视频免费| 99久久精品国产一区二区三区| 成人免费a视频| 亚洲日韩欧美视频一区| 99re久久| 欧美一级免费在线观看| 国产jizzjizz一区二区| 日韩成人免费观看| 亚洲精品一区二区三区婷婷月| 高清不卡亚洲| 日韩欧美一区二区视频在线播放| 美国毛片一区二区三区| 波多野结衣亚洲色图| 亚洲成人在线视频播放| 亚洲精品永久免费视频| 亚洲在线视频一区二区| 国产一区二区不卡| 日本一区二区免费在线观看| 亚洲精品综合精品自拍| 免费成人高清在线视频| 国产精品久久国产| 久久久久久影视| 97超碰国产在线| 久久久女女女女999久久| 一区二区小说| 99视频在线观看视频| 精品久久久一区| 色欧美激情视频在线| 成人动漫视频在线观看免费| 乱人伦精品视频在线观看| 激情五月激情综合| 亚洲成人网在线观看| 国语自产精品视频在线看抢先版结局| 国产传媒久久久| 国产日韩亚洲欧美综合| 亚洲乱熟女一区二区| 国产精品999| 亚洲天堂黄色| 亚洲毛片亚洲毛片亚洲毛片| 精品久久久久久久久久久久久久久| 亚洲伊人av| 精品一区二区三区毛片| 国产亚洲欧美中文| 韩国av电影在线观看| 国产精品偷伦免费视频观看的| 亚洲激情自拍| 麻豆精品国产免费| 亚洲欧美中文在线视频| 日韩区欧美区|