Java Stream流零基础教程
作者:填丶涂 发布时间:2023-08-15 19:33:20
一、Stream流介绍
在JDK8时,JAVA新增了lambda表达式,它与 java.io 包里的 InputStream和 OutputStream是完全不同的概念,他更跟流没有任何关系。它也不同于 StAX 对 XML解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的Stream。
JDK8 中的 Stream 是对集合(Collection)对象功能的增强,它借助于lambda表达式,更优雅的表达风格,极大的提高编程效率和程序可读性。它针对于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。不多说,上用法。
二、Stream流实现与传统方式实现对比
**案例:**找出列表中包含张三且姓名长度为2的名字
2.1、传统方式实现
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 1.定义一个集合
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("张四");
list.add("四");
list.add("张四");
list.add("张四");
list.add("张四");
list.add("张四");
// 2.挑选list中包含张三的
ArrayList<String> list1 = new ArrayList<>();
for (String s : list) {
if (s.startsWith("张三")){
list1.add(s);
}
}
System.out.println("挑选list包含张三的结果:"+list1);
// 3.再从list1中挑选挑选名字长度为2的
ArrayList<String> list2 = new ArrayList<>();
for (String s : list1) {
if (s.length() == 2){
list2.add(s);
}
}
System.out.println("挑选list1长度为2的结果:"+list2);
// 4、遍历
for (String s : list2) {
System.out.println("最终结果 = " + s);
}
}
}
2.2、Stream流方式实现
package com.controller;
import java.util.ArrayList;
public class Boo {
public static void main(String[] args) {
// 定义一个集合,并填入数据
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("李四");
list.add("李四");
list.add("王五");
list.add("王五");
list.add("王五");
//Stream流的实现
list.stream()
.filter((name) -> name.startsWith("张三"))
.filter((name) -> name.length()==2)
.forEach((name) -> System.out.println(name));
}
}
三、Stream流的常用API
3.1、stream流的获取
在Collection集合下,均有一个stream(),另一个即是用Stream的一个静态方法 of() 实现。
上代码:
package com.controller;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Stream;
public class Boo {
public static void main(String[] args) {
//Collction集合
Collection<String> collection = new ArrayList();
Stream<String> stream = collection.stream();
//List集合
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
//ArrayList集合
ArrayList<String> arrayList = new ArrayList<>();
Stream<String> stream2 = arrayList.stream();
//LinkedList集合
LinkedList<String> linkedList = new LinkedList<>();
Stream<String> stream3 = linkedList.stream();
//of()方式的实现
List<String> list1 = new ArrayList<>();
Stream<List<String>> stream4 = Stream.of(list1);
//传入可变数组
Stream<String> stream5 = Stream.of("1","2","3","4");
}
}
3.2、forEach()
遍历流中的对象
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定义一个集合
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("李四");
list.add("李四");
list.add("李四");
list.add("李四");
list.add("李四");
//遍历流的对象
list.stream().forEach((name) -> System.out.println(name));
}
}
3.3、filter()
filter对流对象进行过滤操作
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定义一个集合
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("李四二");
list.add("李四我");
list.add("李四去晚");
list.add("李四请问");
list.add("李四去");
list.add("李四我");
//过滤流的对象
list.stream().filter((name) -> name.length()==2);
}
}
3.4、map()
map()是对集合中的对象进行映射的,将对象从一种类型转换成另一种类型
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定义一个集合
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
//map()是对集合中的对象进行映射的,将对象从一种类型转换成另一种类型
list.stream().map(num -> Integer.parseInt(num));
}
}
3.5、count()
count是对流数据统计的方法,但是count之后返回的是long类型,因此无法再进行流操作。
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定义一个集合
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
//count()对流数据进行统计
System.out.println(list.stream().count());
}
}
3.6、limit()
3.6、limit()
选取流数据的前多少条数据
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定义一个集合
ArrayList<String> list = new ArrayList<>();
list.add("李二1");
list.add("李二2");
list.add("李二3");
list.add("李二4");
list.add("李二5");
list.add("李二6");
list.add("李二7");
//limit() 选取流数据的前多少条数据
list.stream().limit(2);
}
}
3.7、skip()
跳过流数据的前多少条数据,该方法与limit()方法刚好相反
package com.controller;
import java.util.ArrayList;
public class Aoo {
public static void main(String[] args) {
// 定义一个集合
ArrayList<String> list = new ArrayList<>();
list.add("李小龙1");
list.add("李小龙2");
list.add("李小龙3");
list.add("李小龙4");
list.add("李小龙5");
list.add("李小龙6");
list.add("李小龙7");
//skip() 跳过流数据的前多少条数据
list.stream().skip(2);
}
}
3.8、concat()
Stream的静态方法concat()实现对两个流数据进行合并
package com.controller;
import java.util.ArrayList;
import java.util.stream.Stream;
public class Aoo {
public static void main(String[] args) {
// 定义一个集合
ArrayList<String> list = new ArrayList<>();
list.add("张三丰1");
list.add("张三丰2");
list.add("张三丰3");
list.add("张三丰4");
list.add("张三丰5");
list.add("张三丰6");
list.add("张三丰7");
// 定义一个集合
ArrayList<String> list1 = new ArrayList<>();
list1.add("1");
list1.add("2");
list1.add("3");
list1.add("4");
list1.add("5");
list1.add("6");
list1.add("7");
//concat()实现对两个流数据进行合并
Stream.concat(list.stream(),list1.stream());
}
}
四、总结
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让
程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
来源:https://blog.csdn.net/weixin_51423778/article/details/127204113
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 这篇文章主要介绍了spring cloud gateway请求跨域问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定
- 本文实例总结了Java JDBC连接数据库常见操作。分享给大家供大家参考,具体如下:db.properties配置文件(MySql数据库)#
- 在网上拷贝的所有阿里云镜像比如:<mirror> <id>nexus-aliyun</id>
- 默认情况下,如果应用以 Android Q 为目标平台,则在访问外部存储设备中的文件时会进入过滤视图。应用可以使用 Context.getE
- Gradle和Maven都是当前热门的自动化构建工具。使用Gradle去构建项目,由于没有办法像Maven一样配置Setting文件来修改本
- Java 实现网络爬虫框架最近在做一个搜索相关的项目,需要爬取网络上的一些链接存储到索引库中,虽然有很多开源的强大的爬虫框架,但本着学习的态
- 在线程中有两种常用的方法,能够通过数组实现相应的功能,但除此之外在区别上也是很明显的。本篇就其中的代表方法ArrayList和Vector进
- 我们讲一下Criteria查询,这个对于不是太熟悉SQL语句的我们这些程序员来说是很容易上手的。 废话不多说,看一下例子:&nbs
- 1. 什么是λ表达式λ表达式本质上是一个匿名方法。让我们来看下面这个例子: public int add(int x, int
- 因为某个项目需要,为团队其他兄弟姐妹开发了一个 XML 分析处理器,并将其设计为一个类库,提供相应的 API 接口。为了方便大家的使用,需要
- 前言最近在项目中使用到定时任务,之前一直都是使用Quartz 来实现,最近看Spring 基础发现其实Spring 提供 Spring Sc
- 1 redis主从复制的概念多机环境下,一个redis服务接收写命令,当自身数据与状态发生变化,将其复制到一个或多个redis。这种模式称为
- springboot就是简化Spring应用中的初始化配置,快速创建项目而生的。创建springboot项目代开idea,点击File—&g
- 基于jsr303 通过自定义注解实现,实现思路:存在一些瑕疵,后续补充完善。加入依赖部分版本已不默认自动引入该依赖,选择手动引入<de
- 本文实例讲述了Java设计模式之享元模式。分享给大家供大家参考,具体如下:解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- 目录MultipartFile转FileFile转MultipartFile PS:file转base64字符串Multipart
- 本文为大家分享了使用栈的迷宫算法java版,主要考察栈的使用,供大家参考,具体内容如下主要思路如下: do { if(当前位置可通过) {
- 对于初学java的同学来说,第一件事不是写hello world,而是搭建好java开发环境,下载jdk,安装,配置环境变量。这些操作在xp
- 请求参数解析客户端请求在handlerMapping中找到对应handler后,将会继续执行DispatchServlet的doPatch(