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

Java詳細(xì)分析Lambda表達(dá)式與Stream流的使用方法

 更新時(shí)間:2022年04月27日 09:48:37   作者:羨羨ˇ  
Lambda表達(dá)式,基于Lambda所帶來的函數(shù)式編程,又引入了一個(gè)全新的Stream概念,用于解決集合類庫既有的弊端,Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。使用 Lambda 表達(dá)式可以使代碼變的更加簡潔緊湊

Lambda

       Lambda 表達(dá)式是一個(gè)匿名函數(shù),我們可以把 lambda 表達(dá)式理解為一段可以傳遞的代碼(將代碼段像數(shù)據(jù)一樣傳遞)。使用它可以寫出更簡潔, 更靈活的代碼。作為一種更緊湊的代碼風(fēng)格,使 java 語言的表達(dá)式能力得到的提升。

我們可以知道, Lambda表達(dá)式是為簡化語法而存在的

ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o2.compareTo(o1);
    }
});
System.out.println(list);

       這里有一個(gè)List集合 , 并添加了一些元素, 我們想對他進(jìn)行排序, 并且按照降序的方式來排 , 在沒接觸Lambda表達(dá)式之前 ,我們是向上面那樣去做的

       上面這種方式是匿名內(nèi)部類寫法 , 調(diào)用sort()方法時(shí), 要求傳入一個(gè)比較器, Comparator是一個(gè)接口, 接口可以new嗎? 肯定是不能的 , 所以這里是有一個(gè)隱藏的類去實(shí)現(xiàn)了Comparator接口, 并且重寫了它里面的compare()方法 , 來制定我們的比較規(guī)則, 這個(gè)隱藏的類沒有類名, 就是我們這里所說的匿名內(nèi)部類 , 但方法也是不能作為參數(shù)去傳遞的, 所以我們new了這個(gè)匿名內(nèi)部類的對象 , 包裹了實(shí)現(xiàn)后的方法

但是現(xiàn)在我們嫌這個(gè)寫法太啰嗦了 ,我們使用Lambda來看看

// Lambda表達(dá)式
list.sort((o1,o2) -> {return o2.compareTo(o1);});

這就和上面的匿名內(nèi)部類寫法是一樣的

Lambda表達(dá)式的結(jié)構(gòu) : 

左側(cè):lambda 表達(dá)式的參數(shù)列表

右側(cè):lambda 表達(dá)式中需要執(zhí)行的功能,即 lambda 體

(arg1, arg2...) -> { body }

(type1 arg1, type2 arg2...) -> { body }

常見例子

無參數(shù),無返回值,lambda 體中只有一行代碼時(shí),{}可以忽略 () -> System.out.println("Hello World");

無參數(shù),有返回值  () -> { return 3.1415 };

有參數(shù),無返回值  (String s) -> { System.out.println(s); }

有一個(gè)參數(shù),無返回值 s -> { System.out.println(s); }

有多個(gè)參數(shù),有返回值 (int a, int b) -> { return a + b; }

有多個(gè)參數(shù),表達(dá)式參數(shù)類型可以不寫,jvm 可以根據(jù)上下文進(jìn)行類型推斷 (a, b) -> { return a - b; }

功能接口

        功能接口上面一般會(huì)有這樣一個(gè)注解標(biāo)簽@FunctionalInterface , 它表示此接口只有一個(gè)抽象方法, 當(dāng)你注釋的接口違反了 Functional Interface 的契約時(shí),它可以用于編譯器級(jí)錯(cuò)誤

        例如 : 我們剛使用的comparator接口就有這樣的注解

Stream流 

      允許你以聲明式的方式處理數(shù)據(jù)集合,可以把 它看作是遍歷數(shù)據(jù)集的高級(jí)迭代器。此外與 stream 與 lambada 表達(dá)示結(jié)合后 編碼效率與大大提高,并且可讀性更強(qiáng)。

      流更偏向于數(shù)據(jù)處理和計(jì)算,比如 filter、map、find、sort 等。簡單來說,我們通過一個(gè)集合的 stream 方法獲取一個(gè)流,然后對流進(jìn)行一 系列流操作,最后再構(gòu)建成我們需要的數(shù)據(jù)集合。

  

     我們常常將Stream流與Lambda表達(dá)式結(jié)合來編碼 , 那么如何來使用呢 ?

這里分為 3 步 : 

1. 獲得流

2. 中間操作

3. 終端操作

中間操作(往往對數(shù)據(jù)進(jìn)行篩選)

  • filter:過濾流中的某些元素,
  • sorted(): 自然排序,流中元素需實(shí)現(xiàn) Comparable 接口
  • distinct: 去除重復(fù)元素
  • limit(n): 獲取 n 個(gè)元素
  • skip(n): 跳過 n 元素,配合 limit(n)可實(shí)現(xiàn)分頁
  • map(): 將其映射成一個(gè)新的元素

終端操作(往往對結(jié)果集進(jìn)行處理)

  • forEach: 遍歷流中的元素
  • toArray:將流中的元素倒入一個(gè)數(shù)組
  • Min:返回流中元素最小值   Max:返回流中元素最大值
  • count:返回流中元素的總個(gè)數(shù)
  • Reduce:所有元素求和
  • anyMatch:接收一個(gè) Predicate 函數(shù),只要流中有一個(gè)元素滿足條件則返回 true,否則返回
  • falseallMatch:接收一個(gè) Predicate 函數(shù),當(dāng)流中每個(gè)元素都符合條件時(shí)才返回 true,否則返回 false
  • findFirst:返回流中第一個(gè)元素
  • collect:將流中的元素倒入一個(gè)集合,Collection 或 Map
Integer[] arr = new Integer[]{1,4,3,2,5,5};
Arrays.stream(arr)    //拿到流
    .filter((a) -> {return a>3;})  //中間操作,過濾
    .forEach((a) -> {   //終端操作,遍歷
        System.out.println(a);
    });
Integer[] arr = new Integer[]{1,4,3,2,5,5};
Object[] objects = Arrays.stream(arr)
    .sorted().distinct() //排序并去重
    .toArray();  //轉(zhuǎn)數(shù)組
System.out.println(Arrays.toString(objects));
Integer[] arr = new Integer[]{1,4,3,2,5,5};
Integer max = Arrays.stream(arr).distinct()
    .max(((o1, o2) -> {    //去重返回最大值
        return o1 - o2;
    })).get();  //拿到這個(gè)值
//此處max為終端操作,返回的已經(jīng)不是流,而是一個(gè)OPtion的對象
//它里面有一個(gè)get()方法可以返回這個(gè)值
System.out.println(max);
Integer[] arr = new Integer[]{1,4,3,2,5,5};
long count = Arrays.stream(arr).distinct()
    .count();   //返回總個(gè)數(shù)
System.out.println(count);
Integer[] arr = new Integer[]{1,4,3,2,5,5};
Integer i = Arrays.stream(arr).distinct()
    .reduce((o1, o2) -> {  //所有元素求和
        return o1 + o2;
    })
    .get();
System.out.println(i);

這里需要注意的是中間操作的map()方法和終端操作的collect()方法

設(shè)計(jì)一個(gè)Apple類

public class Apple {
    private Integer num;
    private String name;
    private String color;
}

并給出 構(gòu)造 , set 和 get 方法 ,此處由于篇幅 原因省略

List<Apple> list = new ArrayList<>();
list.add(new Apple(100,"蘋果1","紅色"));
list.add(new Apple(105,"蘋果5","紅色"));
list.add(new Apple(104,"蘋果4","紅色"));
list.add(new Apple(103,"蘋果3","紅色"));
list.add(new Apple(102,"蘋果2","紅色"));

往一個(gè)list添加5個(gè)元素 

List<String> collect = list.stream()
    //將屬性的一列通過get方法映射成流
    .map(Apple::getName)
    //轉(zhuǎn)為一個(gè)list集合
    .collect(Collectors.toList());
System.out.println(collect);
List<Apple> collect = list.stream().sorted(((o1, o2) -> {
    //通過num屬性自定義排序
    return o1.getNum() - o2.getNum();
    }))
    //轉(zhuǎn)為一個(gè)list集合
    .collect(Collectors.toList());
System.out.println(collect);
Map<Integer, String> map = list.stream().sorted(((o1, o2) -> {
    return o1.getNum() - o2.getNum();
    }))
    //轉(zhuǎn)map, 第一個(gè)參數(shù)為鍵,第二個(gè)參數(shù)為值
    .collect(Collectors.toMap(Apple::getNum, Apple::getName));
System.out.println(map);

到此關(guān)于Lambda表達(dá)式與Stream流就介紹完了,感謝閱讀

到此這篇關(guān)于Java詳細(xì)分析Lambda表達(dá)式與Stream流的使用方法的文章就介紹到這了,更多相關(guān)Java Lambda與Stream內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中Consumer接口的使用教程詳解

    java中Consumer接口的使用教程詳解

    Java?8?引入了?java.util.function?包,其中包含了一些常用的函數(shù)式接口,Consumer?接口是其中一個(gè)函數(shù)式接口,用于表示接受一個(gè)輸入?yún)?shù)并執(zhí)行某種操作的操作者,下面我們就來學(xué)習(xí)一下他的具體使用吧
    2023-12-12
  • Spring中@Transactional用法詳細(xì)介紹

    Spring中@Transactional用法詳細(xì)介紹

    這篇文章主要介紹了Spring中@Transactional用法詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 在SpringBoot當(dāng)中使用Thymeleaf視圖解析器的詳細(xì)教程

    在SpringBoot當(dāng)中使用Thymeleaf視圖解析器的詳細(xì)教程

    Thymeleaf是一款開源的模板引擎,它允許前端開發(fā)者使用HTML與XML編寫動(dòng)態(tài)網(wǎng)頁,hymeleaf的主要特點(diǎn)是將表達(dá)式語言嵌入到HTML結(jié)構(gòu)中,它支持Spring框架,使得在Spring MVC應(yīng)用中集成非常方便,本文給大家介紹了在SpringBoot當(dāng)中使用Thymeleaf視圖解析器的詳細(xì)教程
    2024-09-09
  • 徹底理解Spring注解@Autowired實(shí)現(xiàn)原理

    徹底理解Spring注解@Autowired實(shí)現(xiàn)原理

    這篇文章主要為大家詳細(xì)的介紹了Spring注解@Autowired實(shí)現(xiàn)的原理,縝密的邏輯分析,實(shí)踐應(yīng)用示例操作說明,讓大家徹底的理解Spring注解@Autowired背后實(shí)現(xiàn)原理
    2022-03-03
  • Java多線程狀態(tài)及方法實(shí)例解析

    Java多線程狀態(tài)及方法實(shí)例解析

    這篇文章主要介紹了Java多線程狀態(tài)及方法實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Spring注解Autowired的底層實(shí)現(xiàn)原理詳解

    Spring注解Autowired的底層實(shí)現(xiàn)原理詳解

    從當(dāng)前springboot的火熱程度來看,java?config的應(yīng)用是越來越廣泛了,在使用java?config的過程當(dāng)中,我們不可避免的會(huì)有各種各樣的注解打交道,其中,我們使用最多的注解應(yīng)該就是@Autowired注解了。本文就來聊聊Autowired的底層實(shí)現(xiàn)原理
    2022-10-10
  • 解決mybatis-plus自定義xml的坑

    解決mybatis-plus自定義xml的坑

    這篇文章主要介紹了解決mybatis-plus自定義xml的坑,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java服務(wù)器的簡單實(shí)現(xiàn)過程記錄

    java服務(wù)器的簡單實(shí)現(xiàn)過程記錄

    在線瀏覽網(wǎng)頁離不開服務(wù)器,用戶發(fā)出請求request,服務(wù)器做出響應(yīng)response,提供給用戶需要的頁面,這篇文章主要給大家介紹了關(guān)于java服務(wù)器簡單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 關(guān)于@Scheduled不執(zhí)行的原因分析

    關(guān)于@Scheduled不執(zhí)行的原因分析

    這篇文章主要介紹了關(guān)于@Scheduled不執(zhí)行的原因分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java服務(wù)端架構(gòu)之微服務(wù)與單體服務(wù)的權(quán)衡方式

    Java服務(wù)端架構(gòu)之微服務(wù)與單體服務(wù)的權(quán)衡方式

    本文比較了Java微服務(wù)與單體服務(wù)的優(yōu)缺點(diǎn),并提供了相應(yīng)的示例代碼,微服務(wù)架構(gòu)具有可擴(kuò)展性、技術(shù)多樣性等優(yōu)勢,但復(fù)雜性和網(wǎng)絡(luò)延遲是缺點(diǎn),單體服務(wù)架構(gòu)簡單易部署,但擴(kuò)展性差,選擇哪種架構(gòu)應(yīng)根據(jù)項(xiàng)目需求和團(tuán)隊(duì)能力
    2025-03-03

最新評(píng)論

城固县| 无锡市| 济源市| 绵竹市| 株洲县| 临海市| 甘孜县| 黎平县| 新宾| 樟树市| 灌阳县| 弥渡县| 弋阳县| 沈丘县| 涟水县| 右玉县| 乌鲁木齐市| 苏州市| 邓州市| 于都县| 日照市| 巢湖市| 乌拉特中旗| 崇仁县| 高雄县| 广宗县| 瓮安县| 龙海市| 垫江县| 红原县| 江都市| 屏边| 延长县| 上林县| 丹阳市| 南宁市| 宁夏| 东至县| 清镇市| 上栗县| 镇坪县|