一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 一篇文章帶你了解Java Stream流

一篇文章帶你了解Java Stream流

2021-12-10 13:00肥兄 Java教程

Stream流是數(shù)據(jù)渠道,用于操作數(shù)據(jù)源(集合、數(shù)組等)所生成的元素序列。這篇文章主要介紹了Java8新特性Stream流的相關(guān)資料,需要的朋友參考下吧

一、Stream流引入

Lambda表達(dá)式,基于Lambda所帶來的函數(shù)式編程,又引入了一個全新的Stream概念,用于解決集合類庫既有的鼻端。(Lambda表達(dá)式詳解在上篇博客內(nèi)容)

現(xiàn)有一個需求:

將list集合中姓張的元素過濾到一個新的集合中

然后將過濾出來的姓張的元素中,再過濾出來長度為3的元素,存儲到一個新的集合中

1.用常規(guī)方法解決需求

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 已知的知識來解決需求
List<String> list1 = new ArrayList<>();
list1.add("張老三");
list1.add("張小三");
list1.add("李四");
list1.add("趙五");
list1.add("張六");
list1.add("王八");
ArrayList<String> list2 = new ArrayList<>();
// 1.將list集合中姓張的元素過濾到一個新的集合中
for(String name : list1){
    if(name.startsWith("張")){
        list2.add(name);
    }
}
ArrayList list3 = new ArrayList();
for (String name : list2) {
    if (name.length() == 3){
        list3.add(name);
    }
}
System.out.println(list3);

        輸出結(jié)果:
            [張顏宇, 張三豐]

2.用Stream流操作集合,獲取流,過濾操作,打印輸出

?
1
2
3
list1.stream().filter((String name)->name.startsWith("張")).filter((String name)->name.length()==3).forEach((String name)->{
            System.out.println("符合條件的姓名:" + name);
        });

( 看不懂沒關(guān)系,下面會講到該方法,這里只是用來引入的)

二、Stream流的格式

?
1
2
3
4
5
Stream<T> filter(Predicate<? super T> predicate);
            -----> 參數(shù):public interface Predicate<T>  (函數(shù)式接口)
                    ----> 抽象方法:boolean test(T t);
            -----> 參數(shù):public interface Consumer<T>  (函數(shù)式接口)
                    ----> 抽象方法:boolean test(T t);

整體代碼看來:流式思想 類似于 工廠車間的“流水線”

( 看不懂沒關(guān)系,下面會講到該方法,這里只是用來引入的)

三、獲取流

根據(jù)集合來獲取:

根據(jù)Collection獲取流:

Collection接口中有一個stream()方法,可以獲取流

default Stream<E> stream()

1.根據(jù)List獲取流

2.根據(jù)Set獲取流

3.根據(jù)Map獲取流

3.1根據(jù)Map集合的鍵來獲取流

3.2根據(jù)Map集合的值獲取流

3.3根據(jù)Map集合的鍵值對對象獲取流

4.根據(jù)數(shù)組獲取流

代碼演示:

1.根據(jù)List集合獲取流

?
1
2
3
4
5
6
7
8
9
// 創(chuàng)建List集合
List<String> list = new ArrayList<>();
list.add("張老三");
list.add("張小三");
list.add("李四");
list.add("趙五");
list.add("張六");
list.add("王八");
Stream<String> stream1 = list.stream();

2.根據(jù)Set集合獲取流

?
1
2
3
4
5
6
7
8
9
// 創(chuàng)建List集合
Set<String> set = new HashSet<>();
list.add("張老三");
list.add("張小三");
list.add("李四");
list.add("趙五");
list.add("張六");
list.add("王八");
Stream<String> stream2 = set.stream();

3.根據(jù)Map集合獲取流

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 創(chuàng)建Map集合
Map<Integer,String> map = new HashMap<>();
map.put(1,"張老三");
map.put(2,"張小三");
map.put(3,"李四");
map.put(4,"趙五");
map.put(5,"張六");
map.put(6,"王八");
// 3.1根據(jù)Map集合的鍵獲取流
Set<Integer> map1 = map.keySet();
Stream<Integer> stream3 = map1.stream();
// 3.2根據(jù)Map集合的值獲取流
Collection<String> map2 = map.values();
Stream<String> stream4 = map2.stream();
// 3.3根據(jù)Map集合的鍵值對對象獲取瑞
Set<Map.Entry<Integer, String>> map3 = map.entrySet();
Stream<Map.Entry<Integer, String>> stream5 = map3.stream();

4.根據(jù)數(shù)組獲取流

?
1
2
3
// 根據(jù)數(shù)組獲取流
String[] arr = {"張顏宇","張三","李四","趙五","劉六","王七"};
Stream<String> stream6 = Stream.of(arr);

 

四、Stream流的常用方法

Stream流的常用方法:

終結(jié)方法:返回值類型不再是Stream接口本身類型的方法,例如:forEach方法和count方法

非終結(jié)方法/延遲方法:返回值類型仍然是Stream接口自身類型的方法,除了終結(jié)方法都是延遲方法。例如:filter,limit,skip,map,conat

方法名稱方法作用方法種類是否支持鏈?zhǔn)秸{(diào)用count統(tǒng)計個數(shù)終結(jié)方法否forEach逐一處理終結(jié)方法否filter過濾函數(shù)拼接是limit取用前幾個函數(shù)拼接是skip跳過前幾個函數(shù)拼接是map映射函數(shù)拼接是concat組合函數(shù)拼接是

方法演示:

1.count方法:

long count (); 統(tǒng)計流中的元素,返回long類型數(shù)據(jù)

?
1
2
3
4
5
6
7
8
9
List<String> list = new ArrayList<>();
list.add("張老三");
list.add("張小三");
list.add("李四");
list.add("趙五");
list.add("張六");
list.add("王八");
long count = list.stream().count();
System.out.println("集合中的元素個數(shù)是:" + count);

        輸出結(jié)果:
            集合中的元素個數(shù)是:6

2.filter方法:

Stream<T> filter(Predicate<? super ?> predicate); 過濾出滿足條件的元素

參數(shù)Predicate:函數(shù)式接口,抽象方法:boolean test (T t)

Predicate接口:是一個判斷接口

?
1
2
3
4
5
6
7
8
// 獲取stream流
Stream<String> stream = Stream.of("張老三", "張小三", "李四", "趙五", "劉六", "王七");
// 需求:過去出姓張的元素
stream.filter((String name)->{
    return name.startsWith("張");
}).forEach((String name)->{
    System.out.println("流中的元素" + name);
});

(上面引入Stream流時,就用到了這個方法)

3.forEach方法

void forEach(Consumer<? super T> action):逐一處理流中的元素

參數(shù) Consumer<? super T> action:函數(shù)式接口,只有一個抽象方法:void accept(T t);

注意:

1.此方法并不保證元素的逐一消費動作在流中是有序進(jìn)行的(元素可能丟失)

2.Consumer是一個消費接口(可以獲取流中的元素進(jìn)行遍歷操作,輸出出去),可以使用Lambda表達(dá)式

?
1
2
3
4
5
6
7
8
9
10
11
List<String> list = new ArrayList<>();
list.add("張老三");
list.add("張小三");
list.add("李四");
list.add("趙五");
list.add("張六");
list.add("王八");
// 函數(shù)模型:獲取流 --> 注意消費流中的元素
list.stream().forEach((String name)->{
    System.out.println(name);
});

        輸出結(jié)果:
            張老三
            張小三
            李四
            趙五
            張六
            王八

4.limit方法

Stream<T> limit(long maxSize); 取用前幾個元素

注意:

參數(shù)是一個long 類型,如果流的長度大于參數(shù),則進(jìn)行截取;否則不進(jìn)行操作

?
1
2
3
4
5
6
// 獲取流的長度
Stream<String> stream1 = Stream.of("張老三", "張小三", "李四", "趙五", "劉六", "王七");
// 需求:保留前三個元素
stream1.limit(3).forEach((String name)->{
    System.out.println("流中的前三個元素是:" + name);
});

        輸出結(jié)果:
            流中的前三個元素是:張老三
            流中的前三個元素是:張小三
            流中的前三個元素是:李四

5.map方法

<r> Stream <R> map(Function<? super T,? exception R> mapper;

參數(shù)Function<T,R>:函數(shù)式接口,抽象方法:R apply(T t);

Function<T,R>:其實就是一個類型轉(zhuǎn)換接口(T和R的類型可以一致,也可以不一致)

?
1
2
3
4
5
6
7
8
// 獲取Stream流
Stream<String> stream1 = Stream.of("11","22","33","44","55");
// 需求:把stream1流中的元素轉(zhuǎn)換為int類型
stream1.map((String s)->{
   return Integer.parseInt(s); // 將String類型的s進(jìn)行轉(zhuǎn)換為Integer類型的元素,并返回
}).forEach((Integer i)->{
    System.out.println(i);  // 將轉(zhuǎn)換后的int類型的元素逐一輸出
});

        輸出結(jié)果:
            11
            22
            33
            44
            55

6.skip方法

Stream<T> skip(long n); 跳過前幾個元素

注意:

如果流的當(dāng)前長度大于n,則跳過前n個,否則將會得到一個長度為0的空流

?
1
2
3
4
5
// 獲取stream流
Stream<String> stream = Stream.of("張老三", "張小三", "李四", "趙五", "劉六", "王七");
stream.skip(3).forEach((String name)->{
    System.out.println("跳過前三個,打印剩下的" + name);
});

  輸出結(jié)果:
            跳過前三個,打印剩下的趙五
            跳過前三個,打印剩下的劉六
            跳過前三個,打印剩下的王七

7.concat方法

public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)

--> 合并兩個流

?
1
2
3
4
5
6
7
Stream<String> stream1 = Stream.of("11","22","33","44","55");
Stream<String> stream2 = Stream.of("張顏宇", "張三", "李四", "趙五", "劉六", "王七");
// 需求:合并兩個流
Stream<String> stream = Stream.concat(stream1,stream2);
stream.forEach((String name)->{
    System.out.print(name);
});

        輸出結(jié)果:
            1122334455張顏宇張三李四趙五劉六王七

五、收集Stream流

Stream流中提供了一個方法,可以把流中的數(shù)據(jù)收集到單例集合中

<R, A> R collect(Collector<? super T, A, R> collector); 把流中的數(shù)據(jù)手機到單列集合中

返回值類型是R。R指定為什么類型,就是手機到什么類型的集合

參數(shù)Collector<? super T, A, R>中的R類型,決定把流中的元素收集到哪個集合中

參數(shù)Collector如何得到 ?,可以使用 java.util.stream.Collectors工具類中的靜態(tài)方法:

- public static <T> Collector<T, ?, List<T>> toList():轉(zhuǎn)換為List集合

- public static <T> Collector<T, ?, Set<T>> toSet() :轉(zhuǎn)換為Set集合

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
List<String> list2 = new ArrayList<>();
list2.add("張老三");
list2.add("張小三");
list2.add("李四");
list2.add("趙五");
list2.add("張六");
list2.add("王八");
// 需求:過濾出姓張的并且長度為3的元素
Stream<String> stream = list2.stream().filter((String name) -> {
    return name.startsWith("張");
}).filter((String name) -> {
    return name.length() == 3;
});
// stream 收集到單列集合中
List<String> list = stream.collect(Collectors.toList());
System.out.println(list);
// stream 手機到單列集合中
Set<String> set = stream.collect(Collectors.toSet());
System.out.println(set);

總結(jié)

本片文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!

原文鏈接:https://blog.csdn.net/m0_60489526/article/details/119984236

延伸 · 閱讀

精彩推薦
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
主站蜘蛛池模板: 教室里的激情电影 | 亚洲经典 | 91在线视频播放 | 人人爱天天做夜夜爽88 | 亚洲国产日韩欧美在线vip1区 | 国产成人综合亚洲亚洲欧美 | 我把校花黑色蕾丝胸罩脱了 | 欧美s级人做人爱c视频 | 青青色在线观看 | 日本阿v在线播放 | 男女车车好快的车车免费网站 | 国产成人精品.一二区 | 欧美图片另类小说综合 | 四虎在线精品观看免费 | 美女脱了内裤让男生玩屁股 | 小鸟酱视频在线观看 | 色综合图区| 日本国产最新一区二区三区 | 国产网站免费在线观看 | 男女肉粗暴进来下面好紧 | 高h喷水荡肉爽文np肉色文 | 亚洲品质自拍视频网站 | 欧美一级片免费 | 秋霞午夜伦午夜高清福利片 | 亚洲精品欧洲久久婷婷99 | 日本大巴车强thepro | 99超级碰碰成人香蕉网 | 欧美精品一区二区三区免费观看 | 91国内精品久久久久影院优播 | 色噜噜 男人的天堂在线观看 | 免费港剧在线观看港剧 | 99久久精品免费看国产 | 亚洲第9页| 国产卡一卡二卡3卡乱码免费 | 国产高清dvd | 国产大神91一区二区三区 | 国产精品视频人人做人人爱 | 国产一区二区在线观看视频 | 91污污视频 | 亚洲国产精品综合久久一线 | 久久无码人妻AV精品一区 |