Java学习day30:Stream流入门、集合获取流对象、流对象的方法(知识点详解)

本文主要是介绍Java学习day30:Stream流入门、集合获取流对象、流对象的方法(知识点详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)


往期回顾

Java学习day29:线程池Pool中创建线程方式(面试必考!)-CSDN博客

Java学习day28:线程池Pool(知识点非常非常的详解)-CSDN博客

Java学习day27:join方法、生产者消费者模式(知识点详解)-CSDN博客

 Java学习day30:Stream流入门、集合获取流对象、流对象的方法

一、 Stream流入门

Stream流的出现,是为了解决集合类库现有的弊端,为了提供一种更简洁、更灵活的数据处理方式。通过Stream流,可以轻松地对集合进行过滤、映射、排序、聚合等操作,而不需要显式地使用循环来处理数据。这样可以提高代码的可读性和可维护性,同时也更容易实现并行处理,从而提高程序的性能。

1.入门案例

下面我们通过一个案例来感受Stream流的作用。

现在有一个需求:
将list集合中姓张的名字元素过滤到新的集合中

①按我们以前集合的做法,就是创建两个集合,一个存入数据,然后遍历这个集合,把符合要求的数据拿出来放到另外一个集合,然后遍历那个集合得到数据。

import java.util.ArrayList;
import java.util.List;public class Demo1 {public static void main(String[] args) {//将list集合中姓张的名字元素过滤到新的集合中List<String> list = new ArrayList<>();list.add("张三");list.add("张小三");list.add("李四");list.add("王五");list.add("张大山");//新建一个新的集合用来存姓张的元素List<String> list1 = new ArrayList<>();for (String s : list) {if (s.startsWith("张")) {list1.add(s);}}System.out.println(list1);}
}

②而如果我们使用stream流,则会出现另一种解决方案,我们可以将集合对象转换成流对象,使用两个方法,filter和foreach完成任务。

 Stream<T> filter(Predicate<? super T> predicate)返回由与此给定谓词匹配的此流的元素组成的流。
void forEach(Consumer<? super T> action)对此流的每个元素执行操作。
import java.util.function.Consumer;
import java.util.function.Predicate;public class Demo1 {public static void main(String[] args) {//使用stream流操作//将集合对象转换成流对象list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("张");}}).forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});}
}

③而且我们会发现,两个方法里的参数,都是接口,如果大家足够熟悉,那么,我们就有了一个更加简便的写法,用lambad表达式 

    import java.util.function.Consumer;import java.util.function.Predicate;public class Demo1 {public static void main(String[] args) {//使用stream流操作//将集合对象转换成流对象list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));}}

大家可以看到,随着我们的不断改进,代码也越来越简洁。但是不知道大家能否感受到Stream流的作用。没关系,我们继续往下看。

二、集合获取流的对象

方式:根据集合获取流,将集合中的数据变成流的形式

这里大家好好理解一下,我们实际上就是通过各种方法,通过集合获取流的对象,有了流对象,我们就可以用流中的方法去操作原来集合中转变成流的数据。

1.三种方式

这三种方式,都是基于Collection接口下面的方法 streram(),因此,如果大家对集合的知识有所遗忘,需要先去补一补集合的有关知识,这样对于Stream流的学习会好很多。

传送门奉上:

Java学习day14:权限修饰符,集合(知识点+例题详解)-CSDN博客

①.根据List获取流对象

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;public class Demo2 {public static void main(String[] args) {List<String> strings = new ArrayList<>();strings.add("老邢");strings.add("老邢xiao");strings.add("xiao邢");strings.add("xiao老邢");//获取流对象Stream<String> stream = strings.stream();System.out.println(stream);}
}

②.set获取stream对象 

import java.util.HashSet;
import java.util.Set;
import java.util.stream.Stream;public class Demo3 {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("嘻嘻");set.add("哈哈");Stream<String> stream = set.stream();System.out.println(stream);}
}

 ③.根据map集合获取流对象

复习一下,map集合添加数据的方法是put(),存储的是键值对,而且map对象没有stream()方法,所以需要转为list或者set对象,怎么转,在分别获取map对象的键和值的时候,就可以进行转化。

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;public class Demo4 {public static void main(String[] args) {Map<String, String> map = new HashMap<>();map.put("1", "狗蛋");map.put("2", "腾飞");//先获取键Set<String> strings = map.keySet();Stream<String> stream = strings.stream();//获取值Collection<String> values = map.values();Stream<String> stream1 = values.stream();//Set<Map.Entry<String, String>> entries = map.entrySet();Stream<Map.Entry<String, String>> stream2 = entries.stream();}
}

三、Stream流对象下面的方法 

流就是集合中的数据,流对象下面的方法是对原来集合中的数据进行操作的

1.常用方法

方法的名称方法的作用方法种类是否支持链式操作
count 统计个数终结方法
forEach逐个处理数据终结方法
filter过滤数据函数的拼接
limit取前几个函数的拼接
skip跳过前几个函数的拼接
map映射函数的拼接
concat拼接函数的拼接

这里我们看两个点:

链式操作

什么是链式操作, 这里我们复习一下,所谓的链式操作就是说,在方法后面还可以.去调用其他方法,如果可以,就是支持链式操作。

方法种类

终结方法:对流操作的时候,链式操作的时候一定是写在最后的

函数拼接:方法还可以接着写方法

打个比方,工厂的流水线:都是先造手机电池->再造手机的主板->造手机端额外壳->一个成品。

所以终结方法一定是写在最后的。


以上,就是今天的所有知识点了。Stream流和集合这两个知识点关系密切,而且在以后的开发中会经常使用到,因此大家要自己多花点时间,静下心看代码,写代码,多理解,多运用,重点是多去运用。至于具体的方法介绍,我们就放到明天再说。

加油吧,预祝大家变得更强!

这篇关于Java学习day30:Stream流入门、集合获取流对象、流对象的方法(知识点详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/690546

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程