欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          本篇文章給大家?guī)砹岁P(guān)于java的相關(guān)知識(shí),其中主要整理了Stream流的概念和使用的相關(guān)問題,包括了Stream流的概念、Stream流的獲取、Stream流的常用方法等等內(nèi)容,下面一起來看一下,希望對(duì)大家有幫助。

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          推薦學(xué)習(xí):《java視頻教程》

          當(dāng)我們說到流的時(shí)候大家就會(huì)很容易聯(lián)想到IO流,以為Stream流也是IO流,其實(shí)不然。Stream流是Java8中引入的一個(gè)全新的概念,用于解決已有集合類庫既有的一些弊端。既然要學(xué)習(xí)Stream流,我們就要暫時(shí)忘記IO流的傳統(tǒng)概念。我們今天就從Stream流的概念、特點(diǎn)、作用、使用方法等方法詳解一下Stream流,那我就一起往下看吧!

          Stream流的概念

          為什么要使用Stream流?

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          Stream流的思想類似于一個(gè)生產(chǎn)車間的流水線。當(dāng)需要對(duì)多個(gè)元素進(jìn)行操作(特別是多步操作)的時(shí)候,考慮到性能及便利性,我們應(yīng)該首先拼好一個(gè)“模型”步驅(qū)方案,然后再按照方案去執(zhí)行它。

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          Stream(流)是一個(gè)來自數(shù)據(jù)源的元素隊(duì)列

          元素是 特定類型的對(duì)象,形成一個(gè)隊(duì)列。lava中的Stream并不會(huì)存儲(chǔ)元素,而是按需計(jì)算。

          數(shù)據(jù)源 流的來源??梢允羌?,數(shù)組等。

          Stream的兩個(gè)基礎(chǔ)的特征:

          ·Pipelining:中間操作都會(huì)飯回流對(duì)象本身。這樣多個(gè)操作可以事聯(lián)成一個(gè)管道,如同流式風(fēng)格(fluentstyle)。這樣做可以對(duì)操作進(jìn)行優(yōu)化,比如延遲執(zhí)行(laziness)和短路(short-circuiting)。

          內(nèi)部迭代:以前對(duì)集合遍歷都是通過iterator或者增強(qiáng)for的方式顯式的在集合外部進(jìn)行迭代,這叫做外部迭代。Stream提供了內(nèi)部迭代的方式,流可以直接調(diào)用遍歷方法。

          當(dāng)使用一個(gè)流的時(shí)候,通常包括三個(gè)基本步驟:獲取一個(gè)數(shù)據(jù)源(source)→數(shù)據(jù)轉(zhuǎn)換一執(zhí)行操作獲取想要的結(jié)果,每次轉(zhuǎn)換原有Stream對(duì)象不改變,返回一個(gè)新的Stream對(duì)象(可以有多次轉(zhuǎn)換),這就允許對(duì)其操作可以像鏈條一樣排列,變成一個(gè)管道。

          Stream流的獲取

          獲取流的常用方式有2種:

          1.通過Collection集合獲取

          2.Stream接口的靜態(tài)方法of獲取

          通過Collection集合獲取

          所有的Collection集合都可以通過stream默認(rèn)方法獲取流

          //把集合轉(zhuǎn)換為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集合需要間接的轉(zhuǎn)換)  Map<String, String>map=new HashMap<>();  //方法一:獲取鍵,存儲(chǔ)到一個(gè)set集合中  Set<String>keySet=map.keySet();  Stream<String>stream3=keySet.stream();  //方法二:獲取值,存儲(chǔ)到一個(gè)collection集合中  Collection<String>values=map.values();  Stream<String>stream4=values.stream();  //方法三:獲取鍵值對(duì),,鍵與值的映射關(guān)系,entrySet()  Set<Map.Entry<String, String>>entries=map.entrySet();  Stream<Map.Entry<String, String>>stream5=entries.stream();

          2.Stream接口的靜態(tài)方法of獲取

          Stream接口的靜態(tài)方法of可以獲取數(shù)組對(duì)應(yīng)的流。

          參數(shù)是一個(gè)可變參數(shù),那么我們就可以傳遞一個(gè)數(shù)組

          //把數(shù)組轉(zhuǎn)換成Stream流  Stream<Integer>stream6=Stream.of(1,2,3,4,5);  //可變參數(shù)可以傳遞數(shù)組  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的常用方法分為兩類:

          延遲方法:返回值類型仍然是Stream接口自身類型的方法,因此支持鏈?zhǔn)秸{(diào)用。(除了終結(jié)方法外,其余方法均為延遲方法。)

          終結(jié)方法:返回值類型不再是Stream接口自身類型的方法,因此不再支持類似StringBuilder那樣的鏈?zhǔn)秸{(diào)用。

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          以上是一些stream流的常用方法,下面我們就依次學(xué)習(xí)一下這些方法的使用。

          forEach遍歷方法

          該方法接受一個(gè)Consumer接口函數(shù),會(huì)將每一個(gè)流元素交給函數(shù)進(jìn)行處理。Consumer接口是一個(gè)消費(fèi)性的函數(shù)式接口,可以傳遞lambda表達(dá)式,消費(fèi)數(shù)據(jù)。

          foeeach方法,用來遍歷流中的數(shù)據(jù),是一個(gè)終結(jié)方法,遍歷之后就不能使用流中的其他方法。

          基本使用

          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));  }  }

          filter過濾方法

          用于對(duì)Stream流中的數(shù)進(jìn)行過濾。filter方法的參數(shù)Predicatehi一個(gè)函數(shù)式接口,所以可以傳遞lambda表達(dá)式,對(duì)數(shù)據(jù)進(jìn)行過濾??梢酝ㄟ^filter方法將一個(gè)轉(zhuǎn)換過濾為下一個(gè)流,如下圖:

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          上面這個(gè)圖把一些不也一樣的元素,用filter方法進(jìn)行過濾,然后成為新的流。

          基本使用

          public class Demo04Stream_filter {  public static void main(String[] args) {  //創(chuàng)建一個(gè)Stream流  Stream<String>stream=Stream .of("張三豐","趙敏","張無忌","周芷若","張三","獅王","張大牛");  //對(duì)Stream流中的元素進(jìn)行過濾。只要張的人  Stream<String>stream2=stream.filter((String name)->{return name.startsWith("張");});  //遍歷Stream流  stream2.forEach(name->System.out.println(name));  }  }

          map映射方法(轉(zhuǎn)換)

          如果需要將流中的元素轉(zhuǎn)換到另一個(gè)流中,可以使用map方法。該接口需要一個(gè)Funtion函數(shù)式接口參數(shù),可以將當(dāng)前流中的T類型數(shù)據(jù)類型轉(zhuǎn)換為另一種R類型的數(shù)據(jù)流,如下圖:

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          上面的圖將不同元素的數(shù)據(jù)轉(zhuǎn)換成用一種類型的元素。

          基本使用

          public class Demo05Stream_map {  public static void main(String[] args) {  //獲取一個(gè)String類型的Stream流  Stream<String>stream=Stream.of("1","2","3","4","5");  //使用map方法,把字符串類型的整數(shù),轉(zhuǎn)換(映射)為integer類型的整數(shù)  Stream<Integer>stream2=stream.map((String s)->{  return Integer.parseInt(s);  });  //遍歷Stream流  stream2.forEach(i->System.out.println(i));  }  }

          count統(tǒng)計(jì)元素個(gè)數(shù)方法

          用于統(tǒng)計(jì)Stream流中的元素個(gè)數(shù),count方法是一個(gè)終結(jié)方法,返回值是一個(gè)Long類型的整數(shù)。所以不能再繼續(xù)調(diào)用Stream流中的其他方法了

          基本使用

          public class Demo06Stream_count {  public static void main(String[] args) {  //獲取一個(gè)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();  //統(tǒng)計(jì)stream流中的元素個(gè)數(shù)  long count=stream.count();  //打印輸出  System.out.println(count);//7  }  }

          limit截取流元素方法

          Limit方法可以對(duì)流進(jìn)行截取,只取用前n個(gè)。參數(shù)是一個(gè)long型,如果集合當(dāng)前長度大于參數(shù)則進(jìn)行截取,否則不進(jìn)行操作。limit方法是一個(gè)延遲方法,只是對(duì)流中的元素進(jìn)行截取,返回一個(gè)新的流,使用可以繼續(xù)調(diào)用stream流中的其他方法。

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          基本使用

          public class Demo07Stream_limit {  public static void main(String[] args) {  show02();  }  private static void show02() {  //創(chuàng)建一個(gè)String類型的數(shù)組  String[]arr={"喜羊羊","美羊羊","沸羊羊","懶羊羊","灰太狼","紅太狼"};  //集合獲取一個(gè)Stream流  Stream<String>stream=Stream.of(arr);  //用limit方法截取前6個(gè)元素  Stream<String>stream2=stream.limit(3);  //遍歷Stream2流  stream2.forEach(i->System.out.println(i));  }  }

          skip跳過元素方法

          如果希望跳過前幾個(gè)元素,可以使用skip方法獲取一個(gè)截取之后的新流,如果流的當(dāng)前長度大于n,則跳過前n個(gè);否則將會(huì)得到一個(gè)長度為0的流。

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          基本使用

          public class Demo08Stream_skip {  public static void main(String[] args) {  //創(chuàng)建一個(gè)String類型的數(shù)組  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:合并方法

          用于把流組合到一塊。如果有兩個(gè)流,希望合并成為一個(gè)流,就可以使用concat方法

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          基本使用

          public class Demo09Stream_concat {  public static void main(String[] args) {  //創(chuàng)建一個(gè)Stream流  Stream<String>stream=Stream.of("張三豐","張翠山","趙敏","周芷若","張無忌");  //創(chuàng)建一個(gè)String類型的數(shù)組  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));  }  }

          Stream流的練習(xí)

          最后,我們通過下面的練習(xí)來鞏固一下上面所學(xué)的內(nèi)容。

          現(xiàn)在有兩個(gè)ArrayList集合存儲(chǔ)隊(duì)伍當(dāng)中的多個(gè)成員姓名,

          要求使用傳統(tǒng)的for循環(huán)(或增強(qiáng)for循環(huán))依次進(jìn)行以下若干操作步驟:

          1.第一個(gè)隊(duì)伍只要名字為3個(gè)字的成員姓名:存儲(chǔ)到一個(gè)新集合中。

          2.第一個(gè)隊(duì)伍篩選之后只要前3個(gè)人;存儲(chǔ)到一個(gè)新集合中。

          3.第二個(gè)隊(duì)伍只要姓張的成員姓名;存儲(chǔ)到一個(gè)新集合中。

          4.第二個(gè)隊(duì)伍篩選之后不要前2個(gè)人;存儲(chǔ)到一個(gè)新集合中。

          5.將兩個(gè)隊(duì)伍合并為一個(gè)隊(duì)伍;存儲(chǔ)到一個(gè)新集臺(tái)中。

          6.根據(jù)姓名創(chuàng)建Person對(duì)象:存儲(chǔ)到一個(gè)新集合中,

          7.打印整個(gè)隊(duì)伍的Person對(duì)象信息。

          示例:

          第一支隊(duì)伍:迪麗熱巴、宋遠(yuǎn)橋、蘇星河、石破天、石中玉、老子、莊子、洪七公

          第二支隊(duì)伍:古娜力扎、張無忌、趙麗穎、張三豐、尼古拉斯趙四、張?zhí)鞇邸埗?/p>

          首先創(chuàng)建Person對(duì)象類

          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 + "]";  }  }

          然后再根據(jù)習(xí)題要求用Stream流進(jìn)行過濾

          1.第一個(gè)隊(duì)伍只要名字為3個(gè)字的成員姓名:存儲(chǔ)到一個(gè)新集合中。

          2.第一個(gè)隊(duì)伍篩選之后只要前3個(gè)人;存儲(chǔ)到一個(gè)新集合中。

          // 第一支隊(duì)伍  // 創(chuàng)建集合  ArrayList<String> one = new ArrayList<>();  // 添加元素  one.add("迪麗熱巴");  one.add("宋遠(yuǎn)橋");  one.add("蘇星河");  one.add("石破天");  one.add("石中玉");  one.add("老子");  one.add("莊子");  one.add("洪七公");  //1.第一個(gè)隊(duì)伍只要名字為3個(gè)字的成員姓名:存儲(chǔ)到一個(gè)新集合中。  //2.第一個(gè)隊(duì)伍篩選之后只要前3個(gè)人;存儲(chǔ)到一個(gè)新集合中。  Stream<String>oneStream=one.stream().filter(name->name.length()==3).limit(3);

          3.第二個(gè)隊(duì)伍只要姓張的成員姓名;存儲(chǔ)到一個(gè)新集合中。

          4.第二個(gè)隊(duì)伍篩選之后不要前2個(gè)人;存儲(chǔ)到一個(gè)新集合中。

          // 第二支隊(duì)伍  // 創(chuàng)建集合  ArrayList<String> tow = new ArrayList<>();  // 添加元素  tow.add("古娜力扎");  tow.add("張無忌");  tow.add("趙麗穎");  tow.add("張三豐");  tow.add("尼古拉斯趙四");  tow.add("張?zhí)鞇?quot;);  tow.add("張二狗");  //3.第二個(gè)隊(duì)伍只要姓張的成員姓名;存儲(chǔ)到一個(gè)新集合中。  //4.第二個(gè)隊(duì)伍篩選之后不要前2個(gè)人;存儲(chǔ)到一個(gè)新集合中。  Stream<String>towStream=tow.stream().filter(name->name.startsWith("張")).skip(2);

          5.將兩個(gè)隊(duì)伍合并為一個(gè)隊(duì)伍;存儲(chǔ)到一個(gè)新集臺(tái)中。

          6.根據(jù)姓名創(chuàng)建Person對(duì)象:存儲(chǔ)到一個(gè)新集合中,

          7.打印整個(gè)隊(duì)伍的Person對(duì)象信息。

          //5.將兩個(gè)隊(duì)伍合并為一個(gè)隊(duì)伍;存儲(chǔ)到一個(gè)新集臺(tái)中。  //6.根據(jù)姓名創(chuàng)建Person對(duì)象:存儲(chǔ)到一個(gè)新集合中,  //7.打印整個(gè)隊(duì)伍的Person對(duì)象信息。  Stream.concat(oneStream,towStream).map(name->new Person(name)).forEach(p->System.out.println(p));

          最后運(yùn)行結(jié)果

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          總結(jié)

          最后,今天的內(nèi)容就學(xué)到這里啦。主要熟悉和明白Stream流的一個(gè)思想概念、會(huì)使用Stream流的獲取、和熟練掌握Stream流的一些常用方法。

          一文掌握J(rèn)ava8新特性Stream流的概念和使用

          推薦學(xué)習(xí):《java視頻教程》

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)