Java Stream流零基礎(chǔ)教程
一、Stream流介紹
在JDK8時(shí),JAVA新增了lambda表達(dá)式,它與 java.io 包里的 InputStream和 OutputStream是完全不同的概念,他更跟流沒有任何關(guān)系。它也不同于 StAX 對(duì) XML解析的 Stream,也不是 Amazon Kinesis 對(duì)大數(shù)據(jù)實(shí)時(shí)處理的Stream。
JDK8 中的 Stream 是對(duì)集合(Collection)對(duì)象功能的增強(qiáng),它借助于lambda表達(dá)式,更優(yōu)雅的表達(dá)風(fēng)格,極大的提高編程效率和程序可讀性。它針對(duì)于對(duì)集合對(duì)象進(jìn)行各種非常便利、高效的聚合操作,或者大批量數(shù)據(jù)操作。不多說,上用法。
二、Stream流實(shí)現(xiàn)與傳統(tǒng)方式實(shí)現(xiàn)對(duì)比
**案例:**找出列表中包含張三且姓名長(zhǎng)度為2的名字
2.1、傳統(tǒng)方式實(shí)現(xiàn)
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 1.定義一個(gè)集合
ArrayList<String> list = new ArrayList<>();
list.add("張三");
list.add("張四");
list.add("四");
list.add("張四");
list.add("張四");
list.add("張四");
list.add("張四");
// 2.挑選list中包含張三的
ArrayList<String> list1 = new ArrayList<>();
for (String s : list) {
if (s.startsWith("張三")){
list1.add(s);
}
}
System.out.println("挑選list包含張三的結(jié)果:"+list1);
// 3.再?gòu)膌ist1中挑選挑選名字長(zhǎng)度為2的
ArrayList<String> list2 = new ArrayList<>();
for (String s : list1) {
if (s.length() == 2){
list2.add(s);
}
}
System.out.println("挑選list1長(zhǎng)度為2的結(jié)果:"+list2);
// 4、遍歷
for (String s : list2) {
System.out.println("最終結(jié)果 = " + s);
}
}
}2.2、Stream流方式實(shí)現(xiàn)
package com.controller;
import java.util.ArrayList;
public class Boo {
public static void main(String[] args) {
// 定義一個(gè)集合,并填入數(shù)據(jù)
ArrayList<String> list = new ArrayList<>();
list.add("張三");
list.add("李四");
list.add("李四");
list.add("李四");
list.add("王五");
list.add("王五");
list.add("王五");
//Stream流的實(shí)現(xiàn)
list.stream()
.filter((name) -> name.startsWith("張三"))
.filter((name) -> name.length()==2)
.forEach((name) -> System.out.println(name));
}
}三、Stream流的常用API
3.1、stream流的獲取
在Collection集合下,均有一個(gè)stream(),另一個(gè)即是用Stream的一個(gè)靜態(tài)方法 of() 實(shí)現(xiàn)。
上代碼:
package com.controller;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Stream;
public class Boo {
public static void main(String[] args) {
//Collction集合
Collection<String> collection = new ArrayList();
Stream<String> stream = collection.stream();
//List集合
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
//ArrayList集合
ArrayList<String> arrayList = new ArrayList<>();
Stream<String> stream2 = arrayList.stream();
//LinkedList集合
LinkedList<String> linkedList = new LinkedList<>();
Stream<String> stream3 = linkedList.stream();
//of()方式的實(shí)現(xiàn)
List<String> list1 = new ArrayList<>();
Stream<List<String>> stream4 = Stream.of(list1);
//傳入可變數(shù)組
Stream<String> stream5 = Stream.of("1","2","3","4");
}
}3.2、forEach()
遍歷流中的對(duì)象
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定義一個(gè)集合
ArrayList<String> list = new ArrayList<>();
list.add("張三");
list.add("李四");
list.add("李四");
list.add("李四");
list.add("李四");
list.add("李四");
list.add("李四");
//遍歷流的對(duì)象
list.stream().forEach((name) -> System.out.println(name));
}
}3.3、filter()
filter對(duì)流對(duì)象進(jìn)行過濾操作
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定義一個(gè)集合
ArrayList<String> list = new ArrayList<>();
list.add("張三");
list.add("李四二");
list.add("李四我");
list.add("李四去晚");
list.add("李四請(qǐng)問");
list.add("李四去");
list.add("李四我");
//過濾流的對(duì)象
list.stream().filter((name) -> name.length()==2);
}
}
3.4、map()
map()是對(duì)集合中的對(duì)象進(jìn)行映射的,將對(duì)象從一種類型轉(zhuǎn)換成另一種類型
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定義一個(gè)集合
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
//map()是對(duì)集合中的對(duì)象進(jìn)行映射的,將對(duì)象從一種類型轉(zhuǎn)換成另一種類型
list.stream().map(num -> Integer.parseInt(num));
}
}3.5、count()
count是對(duì)流數(shù)據(jù)統(tǒng)計(jì)的方法,但是count之后返回的是long類型,因此無(wú)法再進(jìn)行流操作。
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定義一個(gè)集合
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
//count()對(duì)流數(shù)據(jù)進(jìn)行統(tǒng)計(jì)
System.out.println(list.stream().count());
}
}
3.6、limit()3.6、limit()
選取流數(shù)據(jù)的前多少條數(shù)據(jù)
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定義一個(gè)集合
ArrayList<String> list = new ArrayList<>();
list.add("李二1");
list.add("李二2");
list.add("李二3");
list.add("李二4");
list.add("李二5");
list.add("李二6");
list.add("李二7");
//limit() 選取流數(shù)據(jù)的前多少條數(shù)據(jù)
list.stream().limit(2);
}
}3.7、skip()
跳過流數(shù)據(jù)的前多少條數(shù)據(jù),該方法與limit()方法剛好相反
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定義一個(gè)集合
ArrayList<String> list = new ArrayList<>();
list.add("李小龍1");
list.add("李小龍2");
list.add("李小龍3");
list.add("李小龍4");
list.add("李小龍5");
list.add("李小龍6");
list.add("李小龍7");
//skip() 跳過流數(shù)據(jù)的前多少條數(shù)據(jù)
list.stream().skip(2);
}
}3.8、concat()
Stream的靜態(tài)方法concat()實(shí)現(xiàn)對(duì)兩個(gè)流數(shù)據(jù)進(jìn)行合并
package com.controller;
import java.util.ArrayList;
import java.util.stream.Stream;
public class Aoo {
public static void main(String[] args) {
// 定義一個(gè)集合
ArrayList<String> list = new ArrayList<>();
list.add("張三豐1");
list.add("張三豐2");
list.add("張三豐3");
list.add("張三豐4");
list.add("張三豐5");
list.add("張三豐6");
list.add("張三豐7");
// 定義一個(gè)集合
ArrayList<String> list1 = new ArrayList<>();
list1.add("1");
list1.add("2");
list1.add("3");
list1.add("4");
list1.add("5");
list1.add("6");
list1.add("7");
//concat()實(shí)現(xiàn)對(duì)兩個(gè)流數(shù)據(jù)進(jìn)行合并
Stream.concat(list.stream(),list1.stream());
}
}四、總結(jié)
Stream 使用一種類似用 SQL 語(yǔ)句從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)的直觀方式來提供一種對(duì) Java 集合運(yùn)算和表達(dá)的高階抽象。Stream API可以極大提高Java程序員的生產(chǎn)力,讓
程序員寫出高效率、干凈、簡(jiǎn)潔的代碼。這種風(fēng)格將要處理的元素集合看作一種流, 流在管道中傳輸, 并且可以在管道的節(jié)點(diǎn)上進(jìn)行處理, 比如篩選, 排序,聚合等。
到此這篇關(guān)于Java Stream流零基礎(chǔ)教程的文章就介紹到這了,更多相關(guān)Java Stream流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決SpringBoot ClassPathResource的大坑(FileNotFoundException)
這篇文章主要介紹了解決SpringBoot ClassPathResource的大坑(FileNotFoundException),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java泛型與數(shù)據(jù)庫(kù)應(yīng)用實(shí)例詳解
這篇文章主要介紹了Java泛型與數(shù)據(jù)庫(kù)應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了java繼承泛型類實(shí)現(xiàn)增刪改查操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-08-08
Apache Commons Math3學(xué)習(xí)之?dāng)?shù)值積分實(shí)例代碼
這篇文章主要介紹了Apache Commons Math3學(xué)習(xí)之?dāng)?shù)值積分實(shí)例代碼,涉及使用辛普森積分的例子,這里分享給大家,供需要的朋友參考。2017-10-10
Mybatis操作數(shù)據(jù)時(shí)出現(xiàn):java.sql.SQLSyntaxErrorException:?Unknown?c
這篇文章主要介紹了Mybatis操作數(shù)據(jù)時(shí)出現(xiàn):java.sql.SQLSyntaxErrorException:?Unknown?column?'XXX'?in?'field?list',需要的朋友可以參考下2023-04-04
Java中EnumMap和EnumSet枚舉操作類的簡(jiǎn)單使用詳解
這篇文章主要介紹了Java中EnumMap和EnumSet枚舉操作類的簡(jiǎn)單使用詳解,EnumMap是Map接口的一種實(shí)現(xiàn),專門用于枚舉類型的鍵,所有枚舉的鍵必須來自同一個(gè)枚舉?EnumMap不允許鍵為空,允許值為空,需要的朋友可以參考下2023-11-11
Java中使用Thread類和Runnable接口實(shí)現(xiàn)多線程的區(qū)別
這篇文章主要介紹了使用Thread類和Runnable接口實(shí)現(xiàn)多線程的區(qū)別,本文給大家介紹了兩種實(shí)現(xiàn)方式的步驟,除了以上兩種多線程實(shí)現(xiàn)方式,還可以使用 Callable 接口實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
java實(shí)現(xiàn)二維數(shù)組轉(zhuǎn)置的方法示例
這篇文章主要介紹了java實(shí)現(xiàn)二維數(shù)組轉(zhuǎn)置的方法,結(jié)合實(shí)例形式詳細(xì)分析了java二維數(shù)組轉(zhuǎn)置的原理、實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10

