首页后端开发其他后端知识Java Stream流的概念、获取和常用方法是什么

Java Stream流的概念、获取和常用方法是什么

时间2024-03-25 21:20:03发布访客分类其他后端知识浏览1421
导读:今天就跟大家聊聊有关“Java Stream流的概念、获取和常用方法是什么”的内容,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 当我们说到流的时候大家就会很容易联想到I...
今天就跟大家聊聊有关“Java Stream流的概念、获取和常用方法是什么”的内容,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。


当我们说到流的时候大家就会很容易联想到IO流,以为Stream流也是IO流,其实不然。Stream流是Java8中引入的一个全新的概念,用于解决已有集合类库既有的一些弊端。既然要学习Stream流,我们就要暂时忘记IO流的传统概念。我们今天就从Stream流的概念、特点、作用、使用方法等方法详解一下Stream流,那我就一起往下看吧!

Stream流的概念

为什么要使用Stream流?

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集合

ListString>
    list=new ArrayList>
    ();
    

StreamString>
    stream=list.stream();
    

//set集合

SetString>
    set=new HashSet>
    ();
    

StreamString>
    stream2=set.stream();
    

//map集合(map集合需要间接的转换)

MapString, String>
    map=new HashMap>
    ();
    

//方法一:获取键,存储到一个set集合中

SetString>
    keySet=map.keySet();
    

StreamString>
    stream3=keySet.stream();
    

//方法二:获取值,存储到一个collection集合中

CollectionString>
    values=map.values();
    

StreamString>
    stream4=values.stream();
    

//方法三:获取键值对,,键与值的映射关系,entrySet()

SetMap.EntryString, String>
    >
    entries=map.entrySet();
    

StreamMap.EntryString, String>
    >
    stream5=entries.stream();
    

2.Stream接口的静态方法of获取

Stream接口的静态方法of可以获取数组对应的流。

参数是一个可变参数,那么我们就可以传递一个数组

//把数组转换成Stream流

StreamInteger>
    stream6=Stream.of(1,2,3,4,5);


//可变参数可以传递数组

Integer[]arr={
1,2,3,4,5}
    ;
    

StreamInteger>
    stream7=Stream.of(arr);


String[]arr2={
"a","bb","ccc"}
    ;
    

StreamString>
    stream8=Stream.of(arr2);

stream流的常用方法

stream的常用方法分为两类:

延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方法均为延迟方法。)

终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似StringBuilder那样的链式调用。

以上是一些stream流的常用方法,下面我们就依次学习一下这些方法的使用。

forEach遍历方法

该方法接受一个Consumer接口函数,会将每一个流元素交给函数进行处理。Consumer接口是一个消费性的函数式接口,可以传递lambda表达式,消费数据。

foeeach方法,用来遍历流中的数据,是一个终结方法,遍历之后就不能使用流中的其他方法。

基本使用

public class Demo03Stream_forEach {


public static void main(String[] args) {
    

StreamString>
    stream=Stream.of("张三","李四","王五","赵六","小明","小胖");
    

/*stream.forEach((String name)->
{
    

System.out.println(name);


}
    );
    */

stream.forEach(name->
    System.out.println(name));


}


}

filter过滤方法

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

上面这个图把一些不也一样的元素,用filter方法进行过滤,然后成为新的流。

基本使用

public class Demo04Stream_filter {


public static void main(String[] args) {
    

//创建一个Stream流

StreamString>
    stream=Stream .of("张三丰","赵敏","张无忌","周芷若","张三","狮王","张大牛");
    

//对Stream流中的元素进行过滤。只要张的人

StreamString>
    stream2=stream.filter((String name)->
{
    return name.startsWith("张");
}
    );
    

//遍历Stream流

stream2.forEach(name->
    System.out.println(name));


}


}

map映射方法(转换)

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

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

基本使用

public class Demo05Stream_map {


public static void main(String[] args) {
    

//获取一个String类型的Stream流

StreamString>
    stream=Stream.of("1","2","3","4","5");
    

//使用map方法,把字符串类型的整数,转换(映射)为integer类型的整数

StreamInteger>
    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流

ArrayListInteger>
    list=new ArrayListInteger>
    ();
    

//添加元素

list.add(1);
    

list.add(2);
    

list.add(3);
    

list.add(4);
    

list.add(5);
    

list.add(6);
    

list.add(7);
    

StreamInteger>
    stream=list.stream();
    

//统计stream流中的元素个数

long count=stream.count();
    

//打印输出

System.out.println(count);
//7

}


}

limit截取流元素方法

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

基本使用

public class Demo07Stream_limit {


public static void main(String[] args) {
    

show02();


}


private static void show02() {


//创建一个String类型的数组

String[]arr={
"喜羊羊","美羊羊","沸羊羊","懒羊羊","灰太狼","红太狼"}
    ;
    

//集合获取一个Stream流

StreamString>
    stream=Stream.of(arr);
    

//用limit方法截取前6个元素

StreamString>
    stream2=stream.limit(3);
    

//遍历Stream2流

stream2.forEach(i->
    System.out.println(i));


}


}

skip跳过元素方法

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

基本使用

public class Demo08Stream_skip {


public static void main(String[] args) {


//创建一个String类型的数组

String[]arr={
"喜羊羊","美羊羊","懒羊羊","慢羊羊","红太狼","灰太狼","小灰灰","沸羊羊","软绵绵","武大狼"}
    ;
    

//获取Stream流

StreamString>
    stream=Stream.of(arr);
    

//使用skip方法截取后面的元素

StreamString>
    stream2=stream.skip(5);
    

//遍历stream2流

stream2.forEach(i->
    System.out.println(i));


}


}

concat:合并方法

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

基本使用

public class Demo09Stream_concat {


public static void main(String[] args) {
    

//创建一个Stream流

StreamString>
    stream=Stream.of("张三丰","张翠山","赵敏","周芷若","张无忌");


//创建一个String类型的数组

String[]arr={
"喜羊羊","美羊羊","懒羊羊","慢羊羊","红太狼","灰太狼","小灰灰","沸羊羊","软绵绵","武大狼"}
    ;
    

//获取Stream流

StreamString>
    stream2=Stream.of(arr);
    

//使用常用方法concat方法合并流

StreamString>
    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个人; 存储到一个新集合中。

// 第一支队伍

// 创建集合

ArrayListString>
     one = new ArrayList>
    ();
    

// 添加元素

one.add("迪丽热巴");
    

one.add("宋远桥");
    

one.add("苏星河");
    

one.add("石破天");
    

one.add("石中玉");
    

one.add("老子");
    

one.add("庄子");
    

one.add("洪七公");
    

//1.第一个队伍只要名字为3个字的成员姓名:存储到一个新集合中。

//2.第一个队伍筛选之后只要前3个人;
    存储到一个新集合中。

StreamString>
    oneStream=one.stream().filter(name->
    name.length()==3).limit(3);
    

3.第二个队伍只要姓张的成员姓名; 存储到一个新集合中。

4.第二个队伍筛选之后不要前2个人; 存储到一个新集合中。

// 第二支队伍

// 创建集合

ArrayListString>
     tow = new ArrayList>
    ();
    

// 添加元素

tow.add("古娜力扎");
    

tow.add("张无忌");
    

tow.add("赵丽颖");
    

tow.add("张三丰");
    

tow.add("尼古拉斯赵四");
    

tow.add("张天爱");
    

tow.add("张二狗");
    

//3.第二个队伍只要姓张的成员姓名;
    存储到一个新集合中。

//4.第二个队伍筛选之后不要前2个人;
    存储到一个新集合中。

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

最后运行结果

总结

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


以上就是关于Java Stream流的概念、获取和常用方法是什么的介绍,本文内容仅供参考,有需要的朋友可以借鉴了解看看,希望对大家学习或工作,想要了解更多欢迎关注网络,小编每天都会为大家更新不同的知识。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Java Stream流的概念、获取和常用方法是什么
本文地址: https://pptw.com/jishu/653045.html
用TP5怎样编写上传多张图片的功能? DOM节点的属性有何用处,包括哪些呢

游客 回复需填写必要信息