最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java值得使用Lambda的8個(gè)場景合集

 更新時(shí)間:2023年08月04日 14:25:40   作者:一只叫煤球的貓  
可能對(duì)不少人來說,Lambda顯得陌生又復(fù)雜,覺得Lambda會(huì)導(dǎo)致代碼可讀性下降,但畢竟2023年了,JDK都出了那么多新版本,是時(shí)候試試Lambda了

前言

可能對(duì)不少人來說,Lambda顯得陌生又復(fù)雜,覺得Lambda會(huì)導(dǎo)致代碼可讀性下降,詬病Lambda語法,甚至排斥。

其實(shí)所有的這些問題,在嘗試并熟悉后,可能都不是問題。

對(duì)Lambda持懷疑態(tài)度的人,也許可以采取漸進(jìn)式使用Lambda的策略。在一些簡單和低風(fēng)險(xiǎn)的場景下先嘗試使用Lambda,逐漸增加Lambda表達(dá)式的使用頻率和范圍。

畢竟2023年了,JDK都出了那么多新版本,是時(shí)候試試Lambda了!

耐心看完,你一定有所收獲。

1. 對(duì)集合進(jìn)行遍歷和篩選

使用Lambda表達(dá)式結(jié)合Stream API可以在更少的代碼量下實(shí)現(xiàn)集合的遍歷和篩選,更加簡潔和易讀。

原來的寫法:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
for (Integer num : numbers) {
    if (num % 2 == 0) {
        System.out.println(num);
    }
}

優(yōu)化的Lambda寫法:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
       .filter(num -> num % 2 == 0)
       .forEach(System.out::println);

2. 對(duì)集合元素進(jìn)行排序

使用Lambda表達(dá)式可以將排序邏輯以更緊湊的形式傳遞給sort方法,使代碼更加簡潔。

原來的寫法:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
Collections.sort(names, new Comparator<String>() {
    public int compare(String name1, String name2) {
        return name1.compareTo(name2);
    }
});

優(yōu)化的Lambda寫法:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
names.sort((name1, name2) -> name1.compareTo(name2));

3. 集合的聚合操作

Lambda表達(dá)式結(jié)合Stream API可以更優(yōu)雅地實(shí)現(xiàn)對(duì)集合元素的聚合操作,例如求和、求平均值等。

原來的寫法:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (Integer num : numbers) {
    sum += num;
}

優(yōu)化的Lambda寫法:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
                 .reduce(0, Integer::sum);

4. 條件過濾和默認(rèn)值設(shè)置

使用Lambda的Optional類可以更加優(yōu)雅地處理?xiàng)l件過濾和默認(rèn)值設(shè)置的邏輯。

原來的寫法:

String name = "Alice";
if (name != null && name.length() > 0) {
    System.out.println("Hello, " + name);
} else {
    System.out.println("Hello, Stranger");
}

Lambda寫法:

String name = "Alice";
name = Optional.ofNullable(name)
               .filter(n -> n.length() > 0)
               .orElse("Stranger");
System.out.println("Hello, " + name);

5. 簡化匿名內(nèi)部類

可以簡化代碼,同時(shí)提高代碼可讀性。

舉個(gè)創(chuàng)建Thread的例子,傳統(tǒng)方式使用匿名內(nèi)部類來實(shí)現(xiàn)線程,語法較為冗長,而Lambda表達(dá)式可以以更簡潔的方式達(dá)到相同的效果。

原來的寫法:

new Thread(new Runnable() {
    public void run() {
        System.out.println("Thread is running.");
    }
}).start();

Lambda寫法:

new Thread(() -> System.out.println("Thread is running.")).start();
new Thread(() -> {
    // 做點(diǎn)什么
}).start();

這種寫法也常用于簡化回調(diào)函數(shù),再舉個(gè)例子:

假設(shè)我們有一個(gè)簡單的接口叫做Calculator,它定義了一個(gè)單一的方法calculate(int a, int b)來執(zhí)行數(shù)學(xué)運(yùn)算:

// @FunctionalInterface: 標(biāo)識(shí)接口是函數(shù)式接口,只包含一個(gè)抽象方法,從而能夠使用Lambda表達(dá)式來實(shí)現(xiàn)接口的實(shí)例化
@FunctionalInterface 
interface Calculator {
    int calculate(int a, int b);
}

現(xiàn)在,讓我們創(chuàng)建一個(gè)名為CallbackExample的類。該類有一個(gè)名為operate的方法,它接受兩個(gè)整數(shù)和一個(gè)Calculator接口作為參數(shù)。該方法將使用提供的Calculator接口執(zhí)行計(jì)算并返回結(jié)果:

public class CallbackExample {
    public static int operate(int a, int b, Calculator calculator) {
        return calculator.calculate(a, b);
    }
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 5;
        // 使用Lambda作為回調(diào)
        int sum = operate(num1, num2, (x, y) -> x + y);
        int difference = operate(num1, num2, (x, y) -> x - y);
        int product = operate(num1, num2, (x, y) -> x * y);
        int division = operate(num1, num2, (x, y) -> x / y);
        System.out.println("Sum: " + sum);
        System.out.println("Difference: " + difference);
        System.out.println("Product: " + product);
        System.out.println("Division: " + division);
    }
}

通過在方法調(diào)用中直接定義計(jì)算的行為,我們不再需要為每個(gè)運(yùn)算創(chuàng)建多個(gè)實(shí)現(xiàn)Calculator接口的類,使得代碼更加簡潔和易讀

6. 集合元素的轉(zhuǎn)換

使用Lambda的map方法可以更優(yōu)雅地對(duì)集合元素進(jìn)行轉(zhuǎn)換,提高代碼的可讀性

原來的寫法:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> uppercaseNames = new ArrayList<>();
for (String name : names) {
    uppercaseNames.add(name.toUpperCase());
}

Lambda寫法:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> uppercaseNames = names.stream()
                                   .map(String::toUpperCase)
                                   .collect(Collectors.toList());

7. 對(duì)集合進(jìn)行分組和統(tǒng)計(jì)

以更緊湊的形式傳遞分組和統(tǒng)計(jì)的邏輯,避免了繁瑣的匿名內(nèi)部類的聲明和實(shí)現(xiàn)。

通過groupingBy、counting、summingInt等方法,使得代碼更加流暢、直觀且優(yōu)雅。

傳統(tǒng)寫法:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Amy", "Diana");
// 對(duì)名字長度進(jìn)行分組
Map<Integer, List<String>> namesByLength = new HashMap<>();
for (String name : names) {
    int length = name.length();
    if (!namesByLength.containsKey(length)) {
        namesByLength.put(length, new ArrayList<>());
    }
    namesByLength.get(length).add(name);
}
System.out.println("Names grouped by length: " + namesByLength);
// 統(tǒng)計(jì)名字中包含字母'A'的個(gè)數(shù)
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Amy", "Diana");
int namesWithA = 0;
for (String name : names) {
    if (name.contains("A")) {
        namesWithA++;
    }
}
System.out.println("Number of names containing 'A': " + namesWithA);

Lambda寫法:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Amy", "Diana");
// 使用Lambda表達(dá)式對(duì)名字長度進(jìn)行分組
Map<Integer, List<String>> namesByLength = names.stream()
        .collect(Collectors.groupingBy(String::length));
System.out.println("Names grouped by length: " + namesByLength);
// 使用Lambda表達(dá)式統(tǒng)計(jì)名字中包含字母'A'的個(gè)數(shù)
long namesWithA = names.stream()
        .filter(name -> name.contains("A"))
        .count();
System.out.println("Number of names containing 'A': " + namesWithA);

8. 對(duì)大數(shù)據(jù)量集合的并行處理

當(dāng)集合的數(shù)據(jù)量很大時(shí),通過Lambda結(jié)合Stream API可以方便地進(jìn)行并行處理,充分利用多核處理器的優(yōu)勢(shì),提高程序的執(zhí)行效率。

假設(shè)我們有一個(gè)包含一百萬個(gè)整數(shù)的列表,我們想要計(jì)算這些整數(shù)的平均值:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class ParallelStreamExample {
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)包含一百萬個(gè)隨機(jī)整數(shù)的列表
        List<Integer> numbers = new ArrayList<>();
        for (int i = 0; i < 1000000; i++) {
            numbers.add(ThreadLocalRandom.current().nextInt(100));
        }
        // 順序流的處理
        long startTimeSeq = System.currentTimeMillis();
        double averageSequential = numbers.stream()
                                         .mapToInt(Integer::intValue)
                                         .average()
                                         .getAsDouble();
        long endTimeSeq = System.currentTimeMillis();
        System.out.println("Sequential Average: " + averageSequential);
        System.out.println("Time taken (Sequential): " + (endTimeSeq - startTimeSeq) + "ms");
        // 并行流的處理
        long startTimePar = System.currentTimeMillis();
        double averageParallel = numbers.parallelStream()
                                       .mapToInt(Integer::intValue)
                                       .average()
                                       .getAsDouble();
        long endTimePar = System.currentTimeMillis();
        System.out.println("Parallel Average: " + averageParallel);
        System.out.println("Time taken (Parallel): " + (endTimePar - startTimePar) + "ms");
    }
}

分別使用順序流和并行流來計(jì)算列表中整數(shù)的平均值:

  • 順序流:通過stream()方法獲取流,使用mapToInt將Integer轉(zhuǎn)換為int,然后使用average()方法計(jì)算平均值
  • 并行流:使用parallelStream()方法獲取并行流,其他步驟與順序流相同

查看輸出結(jié)果:

Sequential Average: 49.517461
Time taken (Sequential): 10ms
Parallel Average: 49.517461
Time taken (Parallel): 3ms

可以看出,順序流和并行流得到了相同的平均值,但并行流的處理時(shí)間明顯少于順序流。因?yàn)椴⑿辛髂軌驅(qū)⑷蝿?wù)拆分成多個(gè)小任務(wù),并在多個(gè)處理器核心上同時(shí)執(zhí)行這些任務(wù)。

當(dāng)然并行流也有缺點(diǎn):

  • 對(duì)于較小的數(shù)據(jù)集,可能并行流更慢
  • 數(shù)據(jù)處理本身的開銷較大,比如復(fù)雜計(jì)算、大量IO操作、網(wǎng)絡(luò)通信等,可能并行流更慢
  • 可能引發(fā)線程安全問題

收尾

Lambda的使用場景遠(yuǎn)不止這些,在多線程、文件操作等場景中也都能靈活運(yùn)用,一旦熟悉后可以讓代碼更簡潔,實(shí)現(xiàn)精準(zhǔn)而優(yōu)雅的編程。

寫代碼時(shí),改變偏見需要我們勇于嘗試和付諸行動(dòng)。有時(shí)候,我們可能會(huì)對(duì)某種編程語言、框架或設(shè)計(jì)模式持有偏見,認(rèn)為它們不適合或不好用。但是,只有嘗試去了解和實(shí)踐,我們才能真正知道它們的優(yōu)點(diǎn)和缺點(diǎn)。

當(dāng)我們?cè)敢獯蚱婆f有的觀念,敢于嘗試新的技術(shù)和方法時(shí),我們就有機(jī)會(huì)發(fā)現(xiàn)新的可能性和解決問題的新途徑。不要害怕失敗或犯錯(cuò),因?yàn)槊恳淮螄L試都是我們成長和進(jìn)步的機(jī)會(huì)。

只要我們保持開放的心態(tài),不斷學(xué)習(xí)和嘗試,我們就能夠超越偏見,創(chuàng)造出更優(yōu)秀的代碼和解決方案。

所以,讓我們?cè)诰幊痰穆飞希e極地去挑戰(zhàn)和改變偏見。用行動(dòng)去證明,只有不斷地嘗試,我們才能取得更大的進(jìn)步和成功。讓我們敢于邁出第一步,勇往直前,一同創(chuàng)造出更美好的編程世界!

以上就是Java值得使用Lambda的8個(gè)場景合集的詳細(xì)內(nèi)容,更多關(guān)于Java Lambda的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mybatis中返回Map的實(shí)現(xiàn)

    Mybatis中返回Map的實(shí)現(xiàn)

    這篇文章主要介紹了Mybatis中返回Map的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringBoot攔截器excludePathPatterns方法不生效的解決方案

    SpringBoot攔截器excludePathPatterns方法不生效的解決方案

    這篇文章主要介紹了SpringBoot攔截器excludePathPatterns方法不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 基于JSON和java對(duì)象的互轉(zhuǎn)方法

    基于JSON和java對(duì)象的互轉(zhuǎn)方法

    下面小編就為大家?guī)硪黄贘SON和java對(duì)象的互轉(zhuǎn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • 總結(jié)java多線程之互斥與同步解決方案

    總結(jié)java多線程之互斥與同步解決方案

    文中總結(jié)了線程互斥與同步,synchronized使用細(xì)節(jié)及原理,Reentrylock使用細(xì)節(jié)等知識(shí),對(duì)解決Java多線程互斥與同步等問題很有效,,需要的朋友可以參考下
    2021-05-05
  • java運(yùn)行jar包提示?“XXX中沒有主清單屬性”?"找不到主類”兩種解決辦法

    java運(yùn)行jar包提示?“XXX中沒有主清單屬性”?"找不到主類”兩種解決辦法

    本文主要介紹了java運(yùn)行jar包提示?“XXX中沒有主清單屬性”?"找不到主類”兩種解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java中的JScrollPane使用詳細(xì)說明

    Java中的JScrollPane使用詳細(xì)說明

    這篇文章主要給大家介紹了關(guān)于Java中JScrollPane使用的相關(guān)資料,Java JScrollPane是Swing庫提供的一個(gè)組件,用于在需要滾動(dòng)的區(qū)域中顯示內(nèi)容,需要的朋友可以參考下
    2024-07-07
  • JDK自帶的四大命令行工具(jstat/jstack/jmap/jhat)的使用詳解

    JDK自帶的四大命令行工具(jstat/jstack/jmap/jhat)的使用詳解

    jstat、jstack、jmap、jhat這四個(gè)是?JDK?自帶的線上問題排查核心工具,專門用于定位?Java?應(yīng)用的性能瓶頸、內(nèi)存泄漏、死鎖、CPU?飆高等問題,無需額外安裝,只要裝了?JDK?就能用,感興趣的小伙伴可以了解下
    2026-06-06
  • 如何使用intellij IDEA搭建Spring Boot項(xiàng)目

    如何使用intellij IDEA搭建Spring Boot項(xiàng)目

    這篇文章主要介紹了如何使用intellij IDEA搭建Spring Boot項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringMVC實(shí)現(xiàn)自定義類型轉(zhuǎn)換器

    SpringMVC實(shí)現(xiàn)自定義類型轉(zhuǎn)換器

    本篇文章主要介紹了SpringMVC實(shí)現(xiàn)自定義類型轉(zhuǎn)換器 ,詳細(xì)的介紹了自定義類型轉(zhuǎn)換器的用法和好處,有興趣的可以了解一下。
    2017-04-04
  • Java版C語言版簡單使用靜態(tài)語言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的方法

    Java版C語言版簡單使用靜態(tài)語言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的方法

    本文給大家分享java版和C語言版簡單使用靜態(tài)語言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-10-10

最新評(píng)論

靖宇县| 乌海市| 安龙县| 和平县| 佛教| 葫芦岛市| 旬邑县| 新宾| 新郑市| 武宣县| 邹城市| 本溪市| 师宗县| 海城市| 抚远县| 长汀县| 鹤岗市| 新源县| 荣昌县| 金溪县| 喀喇沁旗| 云霄县| 南丹县| 靖江市| 江城| 三江| 郴州市| 丹东市| 杨浦区| 剑河县| 庆阳市| 民县| 荥经县| 庄浪县| 高邮市| 潼南县| 滦平县| 安西县| 遵化市| 克东县| 永平县|