首頁 > Java > java教程 > Java8新功能Stream流怎麼使用

Java8新功能Stream流怎麼使用

王林
發布: 2023-05-11 13:40:06
轉載
1199 人瀏覽過

Java8新功能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, 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();
登入後複製

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);
登入後複製

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

}

}
登入後複製

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

}

}
登入後複製

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

}

}
登入後複製

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

}

}
登入後複製

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

}

}
登入後複製

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

}

}
登入後複製

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

}

}
登入後複製

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);
登入後複製

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流怎麼使用

以上是Java8新功能Stream流怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
java可以做為web的後端嗎?
來自於 1970-01-01 08:00:00
0
0
0
安裝JAVA
來自於 1970-01-01 08:00:00
0
0
0
無法安裝java
來自於 1970-01-01 08:00:00
0
0
0
求救:JAVA加密的資料PHP解密
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板