国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

20 個(gè) Lambda+Stream 代碼示例,簡(jiǎn)化開發(fā)

開發(fā)
今天這篇文章,我整理了 20 個(gè) Lambda+Stream 實(shí)戰(zhàn)案例,從基礎(chǔ)到進(jìn)階,讓代碼量減少 50%,開發(fā)效率直接翻倍!

還在寫一堆循環(huán)和判斷來(lái)處理集合?Lambda 和 Stream 一行代碼搞定的事,不要再寫十幾行了!今天這篇文章,我整理了 20 個(gè) Lambda+Stream 實(shí)戰(zhàn)案例,從基礎(chǔ)到進(jìn)階,讓代碼量減少 50%,開發(fā)效率直接翻倍!

一、Lambda 表達(dá)式:告別冗余代碼

1. 替代匿名內(nèi)部類,讓代碼更簡(jiǎn)潔

以前寫線程 Runnable 要嵌套匿名內(nèi)部類,代碼又長(zhǎng)又亂:

// 傳統(tǒng)方式

new Thread(new Runnable() {


   @Override

   public void run() {


       System.out.println("線程執(zhí)行了");


   }


}).start();


// Lambda 方式(一行搞定)

new Thread(() -> System.out.println("線程執(zhí)行了")).start();

核心邏輯:Lambda 表達(dá)式用 ()->{} 代替了匿名內(nèi)部類,當(dāng)方法體只有一行時(shí),大括號(hào)和 return 都可以省略。

2. 集合排序:告別復(fù)雜的 Comparator

對(duì)列表排序時(shí),Lambda 能把比較邏輯壓縮成一行:

List<String> names = Arrays.asList("張三", "李四", "王五");


// 傳統(tǒng)排序(按長(zhǎng)度)

Collections.sort(names, new Comparator<String>() {


   @Override

   public int compare(String o1, String o2) {


       return o1.length() - o2.length();


   }


});


// Lambda 排序

names.sort((a, b) -> a.length() - b.length());


// 更簡(jiǎn)潔:用方法引用

names.sort(Comparator.comparingInt(String::length));

3. 自定義函數(shù)式接口:靈活傳遞邏輯

定義一個(gè)簡(jiǎn)單的函數(shù)式接口(只有一個(gè)抽象方法),用 Lambda 傳遞具體實(shí)現(xiàn):

// 自定義函數(shù)式接口

@FunctionalInterface

interface MathOperation {


   int operate(int a, int b);


}


// 使用 Lambda 實(shí)現(xiàn)加法和乘法

MathOperation addition = (a, b) -> a + b;


MathOperation multiplication = (a, b) -> a * b;


System.out.println(addition.operate(3, 5)); // 輸出 8

System.out.println(multiplication.operate(3, 5)); // 輸出 15

二、Stream 流:讓集合操作飛起來(lái)

4. 遍歷集合:替代 for 循環(huán)

用 forEach 遍歷集合,代碼更緊湊,還能配合 Lambda 寫邏輯:

List<String> fruits = Arrays.asList("蘋果", "香蕉", "橙子");


// 傳統(tǒng) for 循環(huán)

for (String fruit : fruits) {


   System.out.println(fruit);


}


// Stream 遍歷

fruits.stream().forEach(fruit -> System.out.println(fruit));


// 方法引用更簡(jiǎn)潔

fruits.forEach(System.out::println);

5. 篩選元素:按條件過(guò)濾集合

從集合中篩選出符合條件的元素,比如找出所有偶數(shù):

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);


// 篩選出偶數(shù)

List<Integer> evenNumbers = numbers.stream()


   .filter(n -> n % 2 == 0) // 過(guò)濾條件

   .collect(Collectors.toList()); // 收集結(jié)果

System.out.println(evenNumbers); // 輸出 [2, 4, 6]

6. 映射轉(zhuǎn)換:將一種類型轉(zhuǎn)為另一種

把集合中的元素轉(zhuǎn)換成新的類型,比如提取用戶列表中的姓名:

List<User> users = Arrays.asList(


   new User("張三", 20),


   new User("李四", 25)


);


// 提取所有用戶名

List<String> usernames = users.stream()


   .map(User::getName) // 調(diào)用 User 的 getName 方法

   .collect(Collectors.toList());


System.out.println(usernames); // 輸出 [張三, 李四]

三、Stream 進(jìn)階操作:復(fù)雜邏輯簡(jiǎn)單化

7. 排序:按字段對(duì)集合排序

對(duì)用戶列表按年齡排序,無(wú)需手動(dòng)實(shí)現(xiàn) Comparator:

List<User> users = Arrays.asList(


   new User("張三", 25),


   new User("李四", 20),


   new User("王五", 30)


);


// 按年齡升序排序

List<User> sortedByAge = users.stream()


   .sorted(Comparator.comparingInt(User::getAge))


   .collect(Collectors.toList());


// 按年齡降序排序(加 reversed())

List<User> sortedByAgeDesc = users.stream()


   .sorted(Comparator.comparingInt(User::getAge).reversed())


   .collect(Collectors.toList());

8. 去重:快速去除集合中的重復(fù)元素

用 distinct() 方法一鍵去重,比手動(dòng)遍歷判斷高效 10 倍:

List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3);


List<Integer> distinctNumbers = numbers.stream()


   .distinct()


   .collect(Collectors.toList());


System.out.println(distinctNumbers); // 輸出 [1, 2, 3]

9. 限制和跳過(guò):取前 N 個(gè)或跳過(guò)前 N 個(gè)元素

分頁(yè)查詢時(shí)特別有用,比如取列表中的前 2 個(gè)元素:

List<User> users = Arrays.asList(


   new User("張三", 20),


   new User("李四", 25),


   new User("王五", 30)


);


// 取前 2 個(gè)元素

List<User> top2 = users.stream()


   .limit(2)


   .collect(Collectors.toList());


// 跳過(guò)前 1 個(gè),取剩下的

List<User> skip1 = users.stream()


   .skip(1)


   .collect(Collectors.toList());

四、聚合操作:統(tǒng)計(jì)分析一鍵搞定

10. 求和:計(jì)算集合中數(shù)值的總和

計(jì)算訂單金額總和,不用再循環(huán)累加:

List<Order> orders = Arrays.asList(


   new Order(100.0),


   new Order(200.0),


   new Order(300.0)


);


// 計(jì)算總金額

double total = orders.stream()


   .mapToDouble(Order::getAmount) // 轉(zhuǎn)為 DoubleStream

   .sum(); // 求和

System.out.println(total); // 輸出 600.0

11. 求最大值 / 最小值:快速找到集合中的極值

找出最大年齡的用戶:

List<User> users = Arrays.asList(


   new User("張三", 20),


   new User("李四", 25),


   new User("王五", 30)


);


// 求最大年齡

OptionalInt maxAge = users.stream()


   .mapToInt(User::getAge)


   .max();


// 求最小年齡

OptionalInt minAge = users.stream()


   .mapToInt(User::getAge)


   .min();


// 輸出結(jié)果(用 orElse 避免空指針)

System.out.println(maxAge.orElse(0)); // 輸出 30

12. 計(jì)數(shù):統(tǒng)計(jì)符合條件的元素?cái)?shù)量

統(tǒng)計(jì)年齡大于 25 的用戶數(shù)量:

List<User> users = Arrays.asList(


   new User("張三", 20),


   new User("李四", 25),


   new User("王五", 30)


);


long count = users.stream()


   .filter(user -> user.getAge() > 25)


   .count();


System.out.println(count); // 輸出 1

五、集合轉(zhuǎn)換:List、Set、Map 互轉(zhuǎn)

13. List 轉(zhuǎn) Set:自動(dòng)去重

把 List 轉(zhuǎn)換成 Set,順便去重:

List<String> list = Arrays.asList("a", "b", "a", "c");


Set<String> set = list.stream()


   .collect(Collectors.toSet());


System.out.println(set); // 輸出 [a, b, c]

14. List 轉(zhuǎn) Map:用字段作為 key 或 value

將用戶列表轉(zhuǎn)換成 Map,key 為用戶名,value 為用戶對(duì)象:

List<User> users = Arrays.asList(


   new User("張三", 20),


   new User("李四", 25)


);


// 轉(zhuǎn)為 Map:key=姓名,value=用戶對(duì)象

Map<String, User> userMap = users.stream()


   .collect(Collectors.toMap(


       User::getName, // key 生成器

       Function.identity() // value 生成器(用自身)

   ));

坑點(diǎn)提醒:如果 key 有重復(fù),會(huì)拋出 IllegalStateException,可以用第三個(gè)參數(shù)處理沖突:

// 遇到重復(fù) key 時(shí),保留第一個(gè)

Map<String, User> userMap = users.stream()


   .collect(Collectors.toMap(


       User::getName,


       Function.identity(),


       (existing, replacement) -> existing // 沖突時(shí)取 existing

   ));

六、復(fù)雜場(chǎng)景實(shí)戰(zhàn):鏈?zhǔn)讲僮鹘鉀Q難題

15. 多條件篩選 + 排序 + 提取字段

需求:從訂單列表中篩選出金額大于 100、狀態(tài)為已支付的訂單,按金額降序排序,最后提取訂單號(hào):

List<Order> orders = Arrays.asList(


   new Order("001", 150.0, "已支付"),


   new Order("002", 80.0, "已支付"),


   new Order("003", 200.0, "未支付"),


   new Order("004", 300.0, "已支付")


);


List<String> orderNos = orders.stream()


   // 篩選:金額>100 且 狀態(tài)為已支付

   .filter(o -> o.getAmount() > 100 && "已支付".equals(o.getStatus()))


   // 按金額降序排序

   .sorted(Comparator.comparingDouble(Order::getAmount).reversed())


   // 提取訂單號(hào)

   .map(Order::getOrderNo)


   // 收集結(jié)果

   .collect(Collectors.toList());


System.out.println(orderNos); // 輸出 [004, 001]

16. 批量處理:對(duì)集合中元素統(tǒng)一操作

給所有用戶的年齡加 1:

List<User> users = Arrays.asList(


   new User("張三", 20),


   new User("李四", 25)


);


// 批量修改年齡(注意:需 User 類有 setAge 方法)

users.stream()


   .forEach(user -> user.setAge(user.getAge() + 1));

17. 分組:按字段對(duì)集合分組

按用戶所在城市分組:

List<User> users = Arrays.asList(


   new User("張三", "北京"),


   new User("李四", "上海"),


   new User("王五", "北京")


);


// 按城市分組:key=城市,value=該城市的用戶列表

Map<String, List<User>> groupByCity = users.stream()


   .collect(Collectors.groupingBy(User::getCity));


// 輸出分組結(jié)果

groupByCity.forEach((city, userList) -> {


   System.out.println(city + ":" + userList.stream()


       .map(User::getName)


       .collect(Collectors.toList()));


});


// 輸出:

// 北京:[張三, 王五]

// 上海:[李四]

七、Lambda 與 Optional:避免空指針異常

18. Optional 處理可能為 null 的值

以前判斷對(duì)象是否為 null 要寫多層嵌套,用 Optional 一行搞定:

// 傳統(tǒng)方式(多層判空)

String username = null;


if (user != null) {


   Address address = user.getAddress();


   if (address != null) {


       username = address.getCity();


   }


}


// Optional 方式

String city = Optional.ofNullable(user)


   .map(User::getAddress) // 調(diào)用 getAddress(),若為 null 則停止

   .map(Address::getCity)


   .orElse("未知城市"); // 若最終為 null,返回默認(rèn)值

19. 集合中查找第一個(gè)符合條件的元素

用 findFirst() 快速找到第一個(gè)滿足條件的元素,避免遍歷整個(gè)集合:

List<User> users = Arrays.asList(


   new User("張三", 20),


   new User("李四", 25),


   new User("王五", 30)


);


// 查找第一個(gè)年齡大于 22 的用戶

Optional<User> user = users.stream()


   .filter(u -> u.getAge() > 22)


   .findFirst();


// 存在則輸出姓名

user.ifPresent(u -> System.out.println(u.getName())); // 輸出 李四

20. 并行流:利用多核 CPU 加速處理

數(shù)據(jù)量超大時(shí),用 parallelStream() 開啟并行處理,自動(dòng)利用多個(gè)線程加速:

// 處理 100 萬(wàn)條數(shù)據(jù)(并行流)

List<Long> numbers = new ArrayList<>();


for (long i = 0; i < 1000000; i++) {


   numbers.add(i);


}


// 并行計(jì)算總和(比普通 stream 快幾倍)

long sum = numbers.parallelStream()


   .filter(n -> n % 2 == 0) // 篩選偶數(shù)

   .mapToLong(n -> n)


   .sum();

注意:并行流適合無(wú)狀態(tài)、線程安全的操作,否則可能出現(xiàn)線程安全問題。

為什么 Lambda+Stream 能讓開發(fā)效率翻倍?

傳統(tǒng)集合操作需要寫大量循環(huán)、判斷和臨時(shí)變量,代碼冗長(zhǎng)且可讀性差。而 Lambda+Stream 用鏈?zhǔn)秸{(diào)用和函數(shù)式編程的思想,把復(fù)雜邏輯壓縮成幾行代碼,帶來(lái)三大好處:

  • 代碼量減少 50%:一行流操作頂十行循環(huán)
  • 可讀性提升:鏈?zhǔn)讲僮飨褡匀徽Z(yǔ)言一樣直觀
  • 并行處理簡(jiǎn)單:一行 parallelStream() 就能利用多核 CPU

學(xué)會(huì)這些用法,原來(lái)要寫循環(huán)的,一行代碼就解決問題了,效率就是這么提升的!

責(zé)任編輯:趙寧寧 來(lái)源: 編程江湖
相關(guān)推薦

2020-11-10 08:54:55

Lombok

2010-06-02 10:00:25

MySQL工具

2023-08-11 18:16:08

DevOps開發(fā)

2013-06-04 16:59:42

iOS開發(fā)iOS工具移動(dòng)開發(fā)

2010-05-27 12:30:52

MySQL工具

2010-01-26 09:10:38

Java EE 6注解Profile

2009-06-11 17:54:00

Visual StudDataSet

2023-04-02 14:09:51

2010-05-24 09:47:32

AjaxAjax框架

2010-07-06 10:34:33

RationalJazz需求管理

2023-08-09 08:21:26

2012-04-23 10:05:37

PHPWEB

2015-08-04 09:16:20

JavaLambda表達(dá)式

2011-01-04 09:34:23

LambdaC#

2024-12-05 08:13:18

2024-04-16 08:48:14

WPF開發(fā)MVVM庫(kù)Prism

2024-01-18 15:34:58

Windows操作系統(tǒng)

2018-10-08 08:42:06

編程語(yǔ)言DjangoPython

2013-06-05 10:16:53

2016-11-15 14:07:28

Apache SparLambdaHadoop
點(diǎn)贊
收藏

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

欧美永久精品| 欧美aaa大片| 久久69成人| 51午夜精品国产| 中文在线最新版天堂8| 久久久久一区二区三区四区| 日本三级中国三级99人妇网站| 要久久电视剧全集免费| www.日韩欧美| 四虎影视4hu4虎成人| 337p日本欧洲亚洲大胆精品| melody高清在线观看| 天天爽夜夜爽夜夜爽精品视频| 欧美特级aaa| 久久精品人人做| 国产三区在线视频| 91污片在线观看| 2018国产在线| 9l国产精品久久久久麻豆| www.黄色网址.com| 激情文学综合插| 在线观看亚洲视频啊啊啊啊| 日韩av一级电影| 欧美亚洲一级二级| 9久re热视频在线精品| 92看片淫黄大片看国产片| 成人亚洲一区二区| 国产美女久久久| 亚洲精品网址| 99国产在线观看| 午夜欧美精品久久久久久久| 97人人干人人| 一区免费在线| 欧美日韩国产精品一卡| 亚洲在线视频| 日韩电影免费观看高清完整| 蜜桃视频一区二区| 一区二区在线不卡| 激情综合色丁香一区二区| 一本一道久久a久久精品综合| 精品在线视频一区| 日韩avxxx| 亚洲人精品午夜| 在线碰免费视频在线观看| 欧美色老头old∨ideo| ririsao久久精品一区| 国产一区二区三区在线观看视频| 在线免费成人| 青青a在线精品免费观看| 欧美成人自拍| 热re99久久精品国99热蜜月| 激情六月婷婷综合| 三年中国国语在线播放免费| 亚洲高清一区二区三区| 欧美边添边摸边做边爱免费| 日韩电影免费在线观看中文字幕 | 欧美群妇大交群中文字幕| 91小视频xxxx网站在线| 亚洲精品国产品国语在线| 久久伦理中文字幕| 国产一区深夜福利| 美女在线视频一区| 男女男精品视频站| 欧美性欧美巨大黑白大战| 女人让男人操自己视频在线观看| 久久久午夜视频| 日韩天天综合| 欧美性久久久久| 欧美亚州韩日在线看免费版国语版| 国产中文在线播放| 欧美中文在线字幕| 喷水一区二区三区| 日本aⅴ写真网站免费| 精品国产乱码久久久久久闺蜜| 成人福利一区| 日韩av电影在线观看| 国产日韩欧美制服另类| 国产视频精选在线| 日韩一中文字幕| 欧美日韩国产亚洲一区| 日本大片免费看| 欧美午夜精品久久久久久浪潮| 精品国产第一福利网站| 国产成人一区三区| 久久国产精品第一页| 成片免费观看视频| 亚洲精品国产精品自产a区红杏吧| 天海翼精品一区二区三区| 日韩久久不卡| 亚洲va在线va天堂| 激情久久99| 国产精品毛片va一区二区三区| 久久精品欧美一区二区三区不卡 | 成人国产精品一区| 成人a免费在线看| 69视频在线| 日本精品久久久久影院| 国产福利一区二区| 生活片a∨在线观看| 欧美做受高潮电影o| 成人精品免费看| 人妖欧美1区| 国产精品尤物福利片在线观看| 国产精品99久久久久久似苏梦涵| 男女视频在线观看免费| 久久久久免费精品国产| 国产精品888| 黄色动漫在线观看| 成人有码在线视频| 国产精品久久久久久久岛一牛影视| 国偷自产一区二区免费视频| 国产伦精品一区二区三区高清版 | 国产精品久久久av| aaa亚洲精品| 日本高清视频一区| 亚洲国内自拍| 久草在线新视觉| 久久99热精品这里久久精品| 精品中文字幕一区二区三区四区| 先锋成人影院| 欧美激情资源网| 日韩视频网站在线观看| 久久久久一区二区| 日韩欧美在线视频免费观看| 中国av一区| jizzjizzjizz亚洲| 久久久久国产精品www| 91在线观看免费视频| 欧美日韩五区| 超碰10000| 日韩精品免费在线视频观看| 先锋影音久久久| 黄色软件在线观看| 午夜小视频在线| 亚洲人成无码网站久久99热国产 | 日韩精品社区| 国产在线精品91| 在线成人免费网站| 美女mm1313爽爽久久久蜜臀| 韩国av网站在线| 蜜桃91精品入口| 日韩欧美高清在线| 亚洲欧美日韩视频二区| 国产精品一区二区久久不卡 | 国产精品视频一区二区高潮| 久久久精品综合| 精品国产一级| 男女高潮又爽又黄又无遮挡| 欧美国产日本在线| 日韩欧美在线一区| 亚洲精品乱码久久久久久日本蜜臀| 樱桃视频成人在线观看| 中文一区一区三区免费| 亚洲第一精品福利| 国产欧美一区二区色老头 | 免费观看的av网站| 国产成人+综合亚洲+天堂| 亚洲国产综合色| 国产一区在线视频| 久久久久久美女精品 | 久久精品一区二区| 久久久久蜜桃| 日韩视频一区二区三区在线播放| 在线成人超碰| 欧美性天天影视| 亚洲电影免费| 亚洲日韩第一页| k8久久久一区二区三区| aiss精品大尺度系列| 国产黄色影视| 国产精品初高中精品久久| 亚洲第一中文字幕在线观看| 99久久精品久久久久久清纯| 亚洲精品亚洲人成在线| 天天影院图片亚洲| 日韩高清av| 色播久久人人爽人人爽人人片视av| 99麻豆久久久国产精品免费| 免费毛片在线不卡| a√在线中文网新版址在线| 亚洲人久久久| 欧美高清videos高潮hd| 日韩欧美第一页| 久久国产乱子精品免费女| 国产精品xnxxcom| 在线观看高清av| 综合操久久久| 欧美激情手机在线视频 | 成人免费小视频| 亚洲私拍自拍| 伊人久久视频| 国产黄色av免费看| 精品国产综合| 久久综合色88| 色女孩综合影院| 成人激情动漫在线观看| 波多野结衣的一区二区三区| 成人在线免费观看黄色| 丝袜国产免费观看| 国产a级片免费看|