日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多stream_基础之Lambda和Stream的邂逅

發布時間:2024/8/23 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多stream_基础之Lambda和Stream的邂逅 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基礎之Lambda和Stream的邂逅

show me the code and take to me,做的出來更要說的明白
GitHub項目JavaHouse同步收錄
喜歡就點個贊唄! 你的支持是我分享的動力!

引入

是否有遇到看不懂身邊同事代碼的情況,是否有被面試官問到 Java 新特性不懂的情況。我掐指一算你大概是遇到的了 Lambda 表達式 和 Stream 流。為了解決上述情況,我特地獻上一份關于 Lambda 和 Stream 的指南,以解燃煤之急。

Lambda

普通調用

首先我們先看第一個例子。

@Testpublic void test(){ test1(1); }private void test1(int a){ System.out.println(a);}復制代碼

運行Test,輸出結果

1復制代碼

相信這里大家都很清楚,我不需要多廢話!

內部類調用

那我們在來看看第二個例子

public interface IPerson { void personMethod();}private void test2(IPerson person){ person.personMethod(); }@Testpublic void test2(){ test2(new IPerson(){ @Override public void personMethod() { System.out.println(1); } });}復制代碼

運行Test,輸出結果

1復制代碼

這里的話我將參變成了一個接口,使用了內部類。大家是不是覺得這種形式的代碼不容易看清楚,一個參數竟然放了這么多東西,真是讓人頭大啊。所以我們有了 Lambda 表達式。

Lambda 重構

我們使用 Lambda 表達式重寫上面代碼。得到下面新代碼:

public interface IPerson { void personMethod();}private void test2(IPerson person){ person.personMethod(); }@Testpublic void test2(){ test2(() -> System.out.println(1));}復制代碼

運行Test,輸出結果

1復制代碼

這樣的代碼是不是比使用內部類代碼優雅了很多,看起來舒服極了,關鍵代碼也少了。這就是 Lambda 表達式的魅力。

Lambda 調用

好了,經過上面的層層遞進的例子,我們引出了 Lambda 表達式。現在我們開始了解 Lambda 表達式的語法。

語法:

-> 復制代碼

是的,他的調用語法就是一個箭頭。當然這樣說的話我也不太信。其實還沒說完。

當我們的方法沒有參數的時候,沒有返回,他需要保留括號,形式如下:

() -> System.out.println(1);復制代碼

當有一個參數的時候,沒有返回,小括號可以去掉,形式如下

a -> System.out.println(a)復制代碼

當有多個參數的時候以及方法里面的語法多余一行的時候,沒有返回,,形式如下:

(a, b) -> { System.out.println(a); System.out.println(b); }復制代碼

上面例子都是沒有返回的,那么有返回又是怎樣的呢?形式如下:

a -> { System.out.println(a); return a; }復制代碼

是的,那就加一下返回啊。

函數式接口

其實上面都是展示如果去調用,不知道你們是否發現后者感覺到,他沒有方法名就去調用了,是不是接受不了。這是正常情況。因為我們調用的接口里面這有一個方法,所以我們只需要一個 ->就可以調用到接口里面方法。

所以我們如果想自己寫一個 Lambda 的話。只需要在接口里面寫一個抽象方法即可。舉了例子:

public interface IPerson { int personMethod(int a);}復制代碼

當然我建議加一個注解@FunctionalInterface,形式如下:

@FunctionalInterfacepublic interface IPerson { int personMethod(int a);}復制代碼

這樣就是限制接口里面只能有一個抽象方法了。這個就叫函數式接口。當我們再繼續往里面加的話,就會報錯了:

其實大多數情況下,我們不需要自己寫函數式接口。因為 Java 已經內置了四種常見的函數式接口。

這四個接口需要一般與 Stream 一起使用。

Stream

普通迭代

我們直接看代碼,一個普通的迭代例子

public class StreamTest { @Test public void test2(){ List list = Arrays.asList(1, 2, 3, 4, 5); int count = 0; for (Object o : list){ count ++; } System.out.println(count); }}復制代碼

運行Test,輸出結果

5復制代碼

在 Java8 之前,我們統計 list 的大小是上面的形式。

Stream 重構

現在我們用 Stream 重構上面的代碼

public class StreamTest { @Test public void test3(){ List list = Arrays.asList(1, 2, 3, 4, 5); long count = list.stream().count(); System.out.println(count); }}復制代碼

運行Test,輸出結果

5復制代碼

瞬間感覺代碼清爽了很多,變得優雅了,關鍵代碼也少了。這就是 Stream 的魅力。

經過上面的例子,我們可以感覺到 Stream 可以代替 for 循環,進行特定操作。注意這里是特定的操作,因為 Stream 接口里面只有只封了幾個方法。

collect()

collect() 方法可以將 Stream 變成 List等集合形式。

我們看一個例子:

public class StreamTest { @Test public void test4(){ Stream stream = Stream.of(1, 2, 3, 4, 5,1); List collect = stream.collect(Collectors.toList()); }}復制代碼

fiter()

fiter() 方法與 Predicate 函數接口一起使用。

不想看文字,還有圖片

該方法可以過濾出特定元素并且返回原來的類型。舉一個例子

public class StreamTest { @Test public void test5(){ Stream stream = Stream.of(1, 2, 3, 4, 5,1); List collect = stream.filter(a -> a > 3).collect(Collectors.toList()); System.out.println(Arrays.asList(collect)); }}復制代碼

運行Test,輸出結果

[[4, 5]]復制代碼

map()

map() 方法與 Function 函數接口一起使用。

不想看文字,還有圖片

該方法可以將原來的集合進行修改,包括返回類型,然后返回一個新的集合。舉一個例子

public class StreamTest { @Test public void test8(){ Stream stream = Stream.of(1, 2, 3, 4, 5,1); List collect = stream.map(a -> a = 1).collect(Collectors.toList());// List collect = stream.map(a -> a == 1).collect(Collectors.toList()); System.out.println(Arrays.asList(collect)); }}復制代碼

運行Test,輸出結果

[[1, 1, 1, 1, 1, 1]]復制代碼

我們可以看到兩種情況 Integer -> Integer 以及 Integer -> Boolean

注意我們不能操作同一個 stream 兩次,不然會報錯,有興趣可以試試。

distinct()

該方法意如其字,就是去重。代碼如下

public class StreamTest { @Test public void test7(){ Stream stream = Stream.of(1, 2, 3, 4, 5,1); List collect = stream.distinct().collect(Collectors.toList()); System.out.println(Arrays.asList(collect)); }}復制代碼

運行Test,輸出結果

[[1, 2, 3, 4, 5]]

總結

以上是生活随笔為你收集整理的多stream_基础之Lambda和Stream的邂逅的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。