您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java8新特性Stream流如何使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java8新特性Stream流如何使用”文章能幫助大家解決問題。
Stream流的思想類似于一個生產車間的流水線。當需要對多個元素進行操作(特別是多步操作)的時候,考慮到性能及便利性,我們應該首先拼好一個“模型”步驅方案,然后再按照方案去執行它。
Stream(流)是一個來自數據源的元素隊列
元素是 特定類型的對象,形成一個隊列。lava中的Stream并不會存儲元素,而是按需計算。
數據源 流的來源。可以是集合,數組等。
·Pipelining:中間操作都會飯回流對象本身。這樣多個操作可以事聯成一個管道,如同流式風格(fluentstyle)。這樣做可以對操作進行優化,比如延遲執行(laziness)和短路(short-circuiting)。
內部迭代:以前對集合遍歷都是通過iterator或者增強for的方式顯式的在集合外部進行迭代,這叫做外部迭代。Stream提供了內部迭代的方式,流可以直接調用遍歷方法。
當使用一個流的時候,通常包括三個基本步驟:獲取一個數據源(source)→數據轉換一執行操作獲取想要的結果,每次轉換原有Stream對象不改變,返回一個新的Stream對象(可以有多次轉換),這就允許對其操作可以像鏈條一樣排列,變成一個管道。
獲取流的常用方式有2種:
1.通過Collection集合獲取
2.Stream接口的靜態方法of獲取
所有的Collection集合都可以通過stream默認方法獲取流
//把集合轉換為stream流 //list集合 List<String>list=new ArrayList<>(); Stream<String>stream=list.stream(); //set集合 Set<String>set=new HashSet<>(); Stream<String>stream2=set.stream(); //map集合(map集合需要間接的轉換) Map<String, String>map=new HashMap<>(); //方法一:獲取鍵,存儲到一個set集合中 Set<String>keySet=map.keySet(); Stream<String>stream3=keySet.stream(); //方法二:獲取值,存儲到一個collection集合中 Collection<String>values=map.values(); Stream<String>stream4=values.stream(); //方法三:獲取鍵值對,,鍵與值的映射關系,entrySet() Set<Map.Entry<String, String>>entries=map.entrySet(); Stream<Map.Entry<String, String>>stream5=entries.stream();
Stream接口的靜態方法of可以獲取數組對應的流。
參數是一個可變參數,那么我們就可以傳遞一個數組
//把數組轉換成Stream流 Stream<Integer>stream6=Stream.of(1,2,3,4,5); //可變參數可以傳遞數組 Integer[]arr={1,2,3,4,5}; Stream<Integer>stream7=Stream.of(arr); String[]arr2={"a","bb","ccc"}; Stream<String>stream8=Stream.of(arr2);
延遲方法:返回值類型仍然是Stream接口自身類型的方法,因此支持鏈式調用。(除了終結方法外,其余方法均為延遲方法。)
終結方法:返回值類型不再是Stream接口自身類型的方法,因此不再支持類似StringBuilder那樣的鏈式調用。
以上是一些stream流的常用方法,下面我們就依次學習一下這些方法的使用。
該方法接受一個Consumer接口函數,會將每一個流元素交給函數進行處理。Consumer接口是一個消費性的函數式接口,可以傳遞lambda表達式,消費數據。
foeeach方法,用來遍歷流中的數據,是一個終結方法,遍歷之后就不能使用流中的其他方法。
基本使用
public class Demo03Stream_forEach { public static void main(String[] args) { Stream<String>stream=Stream.of("張三","李四","王五","趙六","小明","小胖"); /*stream.forEach((String name)->{ System.out.println(name); });*/ stream.forEach(name->System.out.println(name)); } }
用于對Stream流中的數進行過濾。filter方法的參數Predicatehi一個函數式接口,所以可以傳遞lambda表達式,對數據進行過濾。可以通過filter方法將一個轉換過濾為下一個流,如下圖:
上面這個圖把一些不也一樣的元素,用filter方法進行過濾,然后成為新的流。
基本使用
public class Demo04Stream_filter { public static void main(String[] args) { //創建一個Stream流 Stream<String>stream=Stream .of("張三豐","趙敏","張無忌","周芷若","張三","獅王","張大牛"); //對Stream流中的元素進行過濾。只要張的人 Stream<String>stream2=stream.filter((String name)->{return name.startsWith("張");}); //遍歷Stream流 stream2.forEach(name->System.out.println(name)); } }
如果需要將流中的元素轉換到另一個流中,可以使用map方法。該接口需要一個Funtion函數式接口參數,可以將當前流中的T類型數據類型轉換為另一種R類型的數據流,如下圖:
上面的圖將不同元素的數據轉換成用一種類型的元素。
基本使用
public class Demo05Stream_map { public static void main(String[] args) { //獲取一個String類型的Stream流 Stream<String>stream=Stream.of("1","2","3","4","5"); //使用map方法,把字符串類型的整數,轉換(映射)為integer類型的整數 Stream<Integer>stream2=stream.map((String s)->{ return Integer.parseInt(s); }); //遍歷Stream流 stream2.forEach(i->System.out.println(i)); } }
用于統計Stream流中的元素個數,count方法是一個終結方法,返回值是一個Long類型的整數。所以不能再繼續調用Stream流中的其他方法了
基本使用
public class Demo06Stream_count { public static void main(String[] args) { //獲取一個Stream流 ArrayList<Integer>list=new ArrayList<Integer>(); //添加元素 list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); Stream<Integer>stream=list.stream(); //統計stream流中的元素個數 long count=stream.count(); //打印輸出 System.out.println(count);//7 } }
Limit方法可以對流進行截取,只取用前n個。參數是一個long型,如果集合當前長度大于參數則進行截取,否則不進行操作。limit方法是一個延遲方法,只是對流中的元素進行截取,返回一個新的流,使用可以繼續調用stream流中的其他方法。
基本使用
public class Demo07Stream_limit { public static void main(String[] args) { show02(); } private static void show02() { //創建一個String類型的數組 String[]arr={"喜羊羊","美羊羊","沸羊羊","懶羊羊","灰太狼","紅太狼"}; //集合獲取一個Stream流 Stream<String>stream=Stream.of(arr); //用limit方法截取前6個元素 Stream<String>stream2=stream.limit(3); //遍歷Stream2流 stream2.forEach(i->System.out.println(i)); } }
如果希望跳過前幾個元素,可以使用skip方法獲取一個截取之后的新流,如果流的當前長度大于n,則跳過前n個;否則將會得到一個長度為0的流。
基本使用
public class Demo08Stream_skip { public static void main(String[] args) { //創建一個String類型的數組 String[]arr={"喜羊羊","美羊羊","懶羊羊","慢羊羊","紅太狼","灰太狼","小灰灰","沸羊羊","軟綿綿","武大狼"}; //獲取Stream流 Stream<String>stream=Stream.of(arr); //使用skip方法截取后面的元素 Stream<String>stream2=stream.skip(5); //遍歷stream2流 stream2.forEach(i->System.out.println(i)); } }
用于把流組合到一塊。如果有兩個流,希望合并成為一個流,就可以使用concat方法
基本使用
public class Demo09Stream_concat { public static void main(String[] args) { //創建一個Stream流 Stream<String>stream=Stream.of("張三豐","張翠山","趙敏","周芷若","張無忌"); //創建一個String類型的數組 String[]arr={"喜羊羊","美羊羊","懶羊羊","慢羊羊","紅太狼","灰太狼","小灰灰","沸羊羊","軟綿綿","武大狼"}; //獲取Stream流 Stream<String>stream2=Stream.of(arr); //使用常用方法concat方法合并流 Stream<String>stream3=Stream.concat(stream, stream2); //遍歷Stream3流 stream3.forEach(i->System.out.println(i)); } }
最后,我們通過下面的練習來鞏固一下上面所學的內容。
現在有兩個ArrayList集合存儲隊伍當中的多個成員姓名,
要求使用傳統的for循環(或增強for循環)依次進行以下若干操作步驟:
1.第一個隊伍只要名字為3個字的成員姓名:存儲到一個新集合中。
2.第一個隊伍篩選之后只要前3個人;存儲到一個新集合中。
3.第二個隊伍只要姓張的成員姓名;存儲到一個新集合中。
4.第二個隊伍篩選之后不要前2個人;存儲到一個新集合中。
5.將兩個隊伍合并為一個隊伍;存儲到一個新集臺中。
6.根據姓名創建Person對象:存儲到一個新集合中,
7.打印整個隊伍的Person對象信息。
示例:
第一支隊伍:迪麗熱巴、宋遠橋、蘇星河、石破天、石中玉、老子、莊子、洪七公
第二支隊伍:古娜力扎、張無忌、趙麗穎、張三豐、尼古拉斯趙四、張天愛、張二狗
首先創建Person對象類
public class Person { private String name; public Person() { super(); } public Person(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person [name=" + name + "]"; } }
然后再根據習題要求用Stream流進行過濾
1.第一個隊伍只要名字為3個字的成員姓名:存儲到一個新集合中。
2.第一個隊伍篩選之后只要前3個人;存儲到一個新集合中。
// 第一支隊伍 // 創建集合 ArrayList<String> one = new ArrayList<>(); // 添加元素 one.add("迪麗熱巴"); one.add("宋遠橋"); one.add("蘇星河"); one.add("石破天"); one.add("石中玉"); one.add("老子"); one.add("莊子"); one.add("洪七公"); //1.第一個隊伍只要名字為3個字的成員姓名:存儲到一個新集合中。 //2.第一個隊伍篩選之后只要前3個人;存儲到一個新集合中。 Stream<String>oneStream=one.stream().filter(name->name.length()==3).limit(3);
3.第二個隊伍只要姓張的成員姓名;存儲到一個新集合中。
4.第二個隊伍篩選之后不要前2個人;存儲到一個新集合中。
// 第二支隊伍 // 創建集合 ArrayList<String> tow = new ArrayList<>(); // 添加元素 tow.add("古娜力扎"); tow.add("張無忌"); tow.add("趙麗穎"); tow.add("張三豐"); tow.add("尼古拉斯趙四"); tow.add("張天愛"); tow.add("張二狗"); //3.第二個隊伍只要姓張的成員姓名;存儲到一個新集合中。 //4.第二個隊伍篩選之后不要前2個人;存儲到一個新集合中。 Stream<String>towStream=tow.stream().filter(name->name.startsWith("張")).skip(2);
5.將兩個隊伍合并為一個隊伍;存儲到一個新集臺中。
6.根據姓名創建Person對象:存儲到一個新集合中,
7.打印整個隊伍的Person對象信息。
//5.將兩個隊伍合并為一個隊伍;存儲到一個新集臺中。 //6.根據姓名創建Person對象:存儲到一個新集合中, //7.打印整個隊伍的Person對象信息。 Stream.concat(oneStream,towStream).map(name->new Person(name)).forEach(p->System.out.println(p));
關于“Java8新特性Stream流如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。