首頁  >  文章  >  Java  >  一文掌握Java8新特性Stream流的概念與使用

一文掌握Java8新特性Stream流的概念與使用

WBOY
WBOY轉載
2022-06-23 12:03:181918瀏覽

本篇文章為大家帶來了關於java的相關知識,其中主要整理了Stream流的概念和使用的相關問題,包括了Stream流的概念、Stream流的獲取、Stream流的常用方法等等內容,下面一起來看一下,希望對大家有幫助。

一文掌握Java8新特性Stream流的概念與使用

推薦學習:《java影片教學

        當我們說到串流的時候大家就會很容易聯想到IO流,以為Stream流也是IO流,其實不然。 Stream流是Java8中引入的一個全新的概念,用來解決已有集合類別函式庫既有的一些弊端。既然要學習Stream流,我們就要暫時忘記IO流的傳統概念。我們今天就從Stream流的概念、特點、作用、使用方法等方法詳解一下Stream流,那我就一起往下看吧!

Stream流的概念

為什麼要使用Stream流?

一文掌握Java8新特性Stream流的概念與使用

 

        Stream流的想法類似生產工場的管線。當需要對多個元素進行操作(特別是多步驟操作)的時候,考慮到性能及便利性,我們應該先拼好一個「模型」步驅方案,然後再按照方案去執行它。

一文掌握Java8新特性Stream流的概念與使用

Stream(流)是來自資料來源的元素佇列

元素是特定類型的對象,形成一個佇列。 lava中的Stream並不會儲存元素,而是按需運算。

資料來源 流的來源。可以是集合,數組等。

Stream的兩個基礎的特徵:

·Pipelining:中間操作都會飯回流物件本身。這樣多個操作可以事聯成一個管道,如同流式風格(fluentstyle)。這樣做可以對操作進行最佳化,例如延遲執行(laziness)和短路(short-circuiting)。

內部迭代:以前對集合遍歷都是透過iterator或增強for的方式顯式的在集合外部進行迭代,這叫做外部迭代。 Stream提供了內部迭代的方式,流可以直接呼叫遍歷方法。

        使用一個流的時候,通常包括三個基本步驟:取得一個資料來源(source)→資料轉換一執行作業取得想要的結果,每次轉換原有Stream物件不改變,傳回一個新的Stream物件(可以有多次轉換),這就允許對其操作可以像鏈條一樣排列,變成一個管道。

Stream流的取得

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

1.透過Collection集合取得

2.Stream接口的靜態方法of取得

透過Collection集合取得

所有的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>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>>entries=map.entrySet();

Stream<map.entry>>stream5=entries.stream();</map.entry></map.entry></string></string></string></string></string></string></string></string></string>

2 .Stream介面的靜態方法of取得

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);</string></integer></integer>

#stream流的常用方法

stream的常用方法分為兩類:

延遲方法:傳回值類型仍然是Stream介面本身類型的方法,因此支援鍊式呼叫。 (除了終結方法外,其餘方法均為延遲方法。)

終結方法:傳回值類型不再是Stream介面本身類型的方法,因此不再支援類似StringBuilder那樣的鍊式呼叫。

一文掌握Java8新特性Stream流的概念與使用

 以上是一些stream串流的常用方法,下面我們就依序學習這些方法的使用。

forEach遍歷方法

        該方法接受一個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));

}

}</string>

 filter过滤方法

        用于对Stream流中的数进行过滤。filter方法的参数Predicatehi一个函数式接口,所以可以传递lambda表达式,对数据进行过滤。可以通过filter方法将一个转换过滤为下一个流,如下图:

一文掌握Java8新特性Stream流的概念與使用

 上面这个图把一些不也一样的元素,用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));

}

}</string></string>

 map映射方法(转换)

        如果需要将流中的元素转换到另一个流中,可以使用map方法。该接口需要一个Funtion函数式接口参数,可以将当前流中的T类型数据类型转换为另一种R类型的数据流,如下图:

一文掌握Java8新特性Stream流的概念與使用

 上面的图将不同元素的数据转换成用一种类型的元素。

 

基本使用

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

}

}</integer></string>

 count统计元素个数方法

        用于统计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

}

}</integer></integer></integer>

limit截取流元素方法

        Limit方法可以对流进行截取,只取用前n个。参数是一个long型,如果集合当前长度大于参数则进行截取,否则不进行操作。limit方法是一个延迟方法,只是对流中的元素进行截取,返回一个新的流,使用可以继续调用stream流中的其他方法。

一文掌握Java8新特性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));

}

}</string></string>

 skip跳过元素方法

        如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流,如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的流。

一文掌握Java8新特性Stream流的概念與使用

基本使用

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

}

}</string></string>

concat:合并方法

        用于把流组合到一块。如果有两个流,希望合并成为一个流,就可以使用concat方法

一文掌握Java8新特性Stream流的概念與使用

基本使用

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

}

}</string></string></string>

Stream流的练习

最后,我们通过下面的练习来巩固一下上面所学的内容。

现在有两个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);</string></string>

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);</string></string>

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流的概念與使用

 

总结

最后,今天的内容就学到这里啦。主要熟悉和明白Stream流的一个思想概念、会使用Stream流的获取、和熟练掌握Stream流的一些常用方法。

一文掌握Java8新特性Stream流的概念與使用

推荐学习:《java视频教程

以上是一文掌握Java8新特性Stream流的概念與使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除