JDK 8 Stream 流 用 法
import com.entity.Person;
import org.junit.Test;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @program: Demohander
* @description:JDK8新特性
* @author: GuoTong
* @create: 2020-11-18 10:14
**/
@SuppressWarnings("all")//正压一切警告
public class JDKStreamTest {
/*在Jdk1.8中引入了stream流的概念,
这个“流”并不同于IO中的输入和输出流,
它是Jdk中的一个类,
具体位置在:java.util.stream.Stream*/
/*关于它的操作主要分为三种:获取流、中间操作、最终操作*/
/*所谓获取流,就是将其他对象(非Stream对象)转为Stream对象。
只有两类对象可能转化为Stream对象,分别是:
数组(这个数组中的元素必须是引用类型)
集合*/
@Test
public void TestCreateStream() {
//数组获取流
Integer[] iArr = {12, 14, 15, 15, 17, 19, 22};
Stream<Integer> streamByArrInt = Stream.of(iArr);
// 数组
String[] str = "I Love You But I miss You so I miss you".split(" ");
Stream<String> streamByArrStr = Arrays.stream(str);
//集合获取流
List<String> list = Arrays.asList(str);
Stream<String> streamList = list.stream();
}
/*Stream流常用的中间操作:filter 过滤某些规则下的东西
* Stream流常用的终止操作:collect(Collectors.toList())---返回一个集合
* flatMap 可用Stream替换值,然后将多个Stream连接成一个Stream,会将之前生成Stream流的每一个元素更换为一个新的Stream对象。*/
@Test
public void TestStream01() {
//filter :
// filter方法用于通过设置的条件过滤出元素,下面的例子是过滤出长度大于3的字符串
String[] s = "I Love You But I miss You so I miss you".split(" ");
List<String> list = Arrays.asList(s);
// List流转:赛选大于3个字段的,返回一个集合
/*list.stream().filter(str -> str.length() > 3):只是流操作了,原数据并未改变*/
/*list.stream().filter(str -> str.length() > 3).collect(Collectors.toList());返回的新集合就改变了*/
List<String> collect = list.stream().filter(str -> str.length() > 3).collect(Collectors.toList());
collect.forEach(System.out::println);//还是经过流处理的集合
//map
//map元素用于映射每隔元素到对应的结果,下面的例子用map输出元素对应的平方数
Stream.of(1, 2, 3, 4, 5).map(i -> i * i).forEach(System.out::println);
System.out.println("============");
//flatMap 可用Stream替换值,然后将多个Stream连接成一个Stream,会将之前生成Stream流的每一个元素更换为一个新的Stream对象。
Stream<Integer> stream2 = Stream.of(1, 2).distinct()
.flatMap(numbers -> Stream.of(5, 6, 6, 7, 8));
//会将1,2都会替换为5,6,7,8,5,6,7,8
Object[] objects = stream2.toArray();
for (Object object : objects) {
System.out.println(object);
}
}
/*map、sorted测试*/
@Test
public void TestStream02() {
String[] str = {"1", "-12", "10", "23", "4", "7", "3"};
//map
//map元素内部遍历集合,可以对集合元素一系列操作。
List<String> list = Arrays.asList(str);
/*将集合元素转为大写(每个元素映射到大写)->降序排序->迭代输出*/
/*原始字符串的转大写,比较大小降序*/
Stream.of("a", "c", "f", "b", "w", "h", "z").map(String::toUpperCase).sorted((a, b) -> a.compareTo(b)).forEach(System.out::println);
System.out.println("====================================");
/*new Function<String, Integer>():标识类型转换:第一个范式需要转换为第二个范式的类型*/
list.stream().map(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s);
}
}).sorted((x, y) -> y - x).forEach(x -> System.out.print(x + ","));/*sorted((x,y)-> y-x):内部是compareTo方法实现,采用lambda表达式*/
/*x-> System.out.print(x+",") 对比 System.out::println ,前者可以自定义输出内容,lambda表达式,后者只能原样输出*/
System.out.println("=================================");
list.stream().map(x -> x + "1").forEach(x -> System.out.print(x + ","));
}
/*map、sorted等较完整的链式编程*/
@Test
public void TestStream03() {
String[] str = {"17", "-12", "10", "23", "24", "17", "23", "15", "52", "12", "24", "14"};
List<String> list = Arrays.asList(str);
System.out.println("================集中多路链式编程=================");
/*集中多路链式编程*/
List<Integer> collect = list.stream().map(new Function<String, Integer>() {//类型转化为int
@Override
public Integer apply(String s) {
return Integer.parseInt(s);
}
}).limit(5) //限制,只取前几个元素
.skip(1) //跳过,表示跳过前几个元素
.distinct() //去重
.sorted() //自然排序
.sorted(Integer::compareTo)//自定义排序,默认降序
.collect(Collectors.toList());//返回出去
collect.forEach(System.out::println);//打印
}
/*终止操作*/
@Test
public void TestStream04() {
//reduce:一般用于求和,第一个参数一般是结果的初始值,第二个参数操作
//静态流:Stream.of(1,2,3)
Integer reduce = Stream.of(1, 2, 3, 4, 3, 2, 5, 1, 4, 2, 5).distinct().reduce(0, (x1, x2) -> x1 + x2);
System.out.println("不重复的和:" + reduce);
//第二个:collect(Collectors.toList());将流转化为XXX(list,set,hashset。。。。)
//stream.collect(Collectors.toCollection(HashSet::new));
String[] str = {"17", "-12", "10", "23", "24", "17", "23", "15", "52", "12", "24", "14"};
List<String> list = Arrays.asList(str);
HashSet<String> collect = list.stream().distinct().collect(Collectors.toCollection(HashSet::new));
Iterator<String> iterator = collect.iterator();//使用集合的迭代器迭代
while (iterator.hasNext()) {
String next = iterator.next();//迭代每一个元素
System.out.println(next);
}
//count方法是用来统计流中元素的个数
long count = Stream.of(1, 2, 3, 4, 3, 2, 5, 1, 4, 2, 5).distinct().count();
System.out.println("不重复的个数:" + count);
}
/*Stream 流判空过滤*/
@Test
public void TestStream05() {
ArrayList<Person> arrayList = new ArrayList<>();
arrayList.add(new Person());
arrayList.add(null);
arrayList.add(new Person("小郭", 23));
arrayList.add(new Person("小李", 21));
arrayList.add(new Person("三少", 18));
/*过滤找出null*/
arrayList.stream().filter(Objects::isNull).forEach(person -> {
System.out.println("是空的");
});
System.out.println("=============================");
/*过滤找出不是null的,但是包含空参构造对象*/
arrayList.stream().filter(Objects::nonNull).forEach(person -> {
System.out.println(person.getAge());
System.out.println(person.getName());
});
/*当arrayList为null的时候不会报空指针错误,并且还打了日志。*/
System.out.println("=============================");
arrayList = null;
Optional.ofNullable(arrayList).orElseGet(() -> {
System.out.println("personList 是空的");
return new ArrayList<>();
}).stream().filter(Objects::nonNull).forEach(person -> {
System.out.println(person.getAge());
System.out.println(person.getName());
});
}
/*Stream的匹配操作:anymatch(是否涵盖)||allMatch(全部的原始是否都涵盖)*/
@Test
public void TestStream06() {
//数据封装
ArrayList<Person> arrayList = new ArrayList<>(); arrayList.add(
new Person()); arrayList.add(
null); arrayList.add(
new Person("小郭", 23)); arrayList.add(
new Person("小李", 21)); arrayList.add(
new Person("三少", 18));
//测试涵盖
boolean anyMatch = Optional.ofNullable(arrayList).orElseGet(() -> { System.
out.println("personList 是空的");
return new ArrayList<>(); }).stream(). filter(Objects::
nonNull). filter(s -> s.getName() !=
null). anyMatch((person) -> person.getName().startsWith(
"小")); String name = anyMatch ?
"涵盖--->名字以“小”字母开头的" : "不涵盖"; System.
out.println(name); System.
out.println("=====================================");
//测试是否都满足
boolean allMatch = Optional.ofNullable(arrayList).orElseGet(() -> { System.
out.println("personList 是空的");
return new ArrayList<>(); }).stream(). filter(Objects::
nonNull). filter(s -> s.getName() !=
null). allMatch(person -> person.getName().startsWith(
"小")); String allName = allMatch ?
"全都--->名字以“小”字母开头的" : "不全"; System.
out.println(allName); System.
out.println("=====================================");
/*noneMatch((s) -> s.startsWith("d"));集合中是否没有元素匹配以'd'开头*/
}
/*并行 parallelStream 流*/
@Test
public void TestStreamToDouble() {
/*回去并行流的两种方式*/
// 直接获取并行的流
ArrayList<Integer> list = new ArrayList<>(); Stream<Integer> stream01 = list.parallelStream();
// 将串行流转成并行流
ArrayList<Integer> list2 = new ArrayList<>(); Stream<Integer> stream02 = list2.stream().parallel();
/*大量数据时,并行流会比串行流更快:底层是Fork/Join框架;少量数据时,由于使用框架会损耗资源,所以建议用串行流*/
/*并行流和串行流比较*/
//顺序输出 123456789
List<Integer> numbers = Arrays.asList( 5, 6, 7, 8, 9,1, 2, 3, 4); numbers.stream().sorted().forEach(System.
out::print); System.
out.println();//换行
//并行乱序输出 比如 658974132 此输出不固定
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 3, 7, 2, 5);
//虽然写了排序,但是输出是未排序的;当然串行流不会,写了排序就会排序
nums.parallelStream().distinct().sorted((x, y) -> x - y).forEach(x->System.out.println(x+",")); System.
out.println("===================");
// count()||collect()||reduce() 是终止操作,有终止操作才会执行中间操作sorted()
List<Integer> collect = nums.parallelStream().distinct().sorted((x, y) -> x - y).collect(Collectors.toList()); collect.forEach(System.
out::println);
/*部分情况会有线程安全问题,parallelStream里面使用的外部变量,比如集合一定要使用线程安全集合,不然就会引发多线程安全问题*/
//建议使用JUC下的东西
}}
JDK 8 Stream 流 用 法的更多相关文章
- java8 Stream的实现原理 (从零开始实现一个stream流)
1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2 ...
- JDK 8 中Stream流中的去重的方法
JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...
- 【JDK8】JDK 8 中Stream流中的去重的方法
JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...
- Java Stream 流(JDK 8 新特性)
什么是 Steam Java 8 中新增了 Stream(流)来简化集合类的使用,Stream 本质上是个接口,接口中定义了很多对 Stream 对象的操作. 我们知道,Java 中 List 和 S ...
- Java中的文件和stream流的操作代码
1.Java中FileRead方法的运用代码及详解 package example2;import java.io.FileReader;import java.io.IOException;clas ...
- JavaSE复习(七)Stream流和方法引用
Stream流 全新的Stream概念,用于解决已有集合类库既有的弊端. 传统集合的多步遍历代码 几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作.而当我们 ...
- 手把手带你体验Stream流
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 上一篇讲解到了Lambda表达式的使用<最近学 ...
- Java 8创建Stream流的5种方法
不知不觉间,Java已经发展到13了,来不及感慨时间过得真的太快了,来不及学习日新月异的技术更新,目前大多数公司还是使用的JDK8版本,一方面是版本的稳定,另一方面是熟悉,所以很多公司都觉得不升级也挺 ...
- Lambda学习总结(二)--Stream流
一.Stream 流 1.1 概念 官方解释:可以支持顺序和并行对元素操作的元素集合. 简单来讲,Stream 就是 JDK8 提供给我们的对于元素集合统一.快速.并行操作的一种方式. 它能充分运用多 ...
- JDK8新特性之Stream流
是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西. 流可以简单的说是处理数据集合的东西,可以申明式流式A ...
随机推荐
- Linux 压缩、解压缩命令
Linux 压缩.解压缩命令 tar 语法命令 tar [options-] [files] options: 选择 描述 -A 追加tar文件至归档 -c 创建一个新文档 -d 找出归档和文件系统的 ...
- 新一代网络请求库:python-httpx库
目录 httpx库 一. 概述 1. 简介 2. 命令行模式 3. 快速开始 3.1 get请求 3.2 post请求 3.2.1 表单 3.2.2 文件 3.2.3 JSON 3.2.4 二进制 3 ...
- 大规模数据分析统一引擎Spark最新版本3.3.0入门实战
@ 目录 概述 定义 Hadoop与Spark的关系与区别 特点与关键特性 组件 集群概述 集群术语 部署 概述 环境准备 Local模式 Standalone部署 Standalone模式 配置历史 ...
- 数据仓库与hive
数据仓库与hive hive--数据仓库建模工具之一 一.数据库.数据仓库 1.1 数据库 关系数据库本质上是一个二元关系,说的简单一些,就是一个二维表格,对普通人来说,最简单的理解就是一个Excel ...
- 【原创】FFMPEG录屏入门指南
下载ffmpeg 点击 ffmpeg官网,选择windows,然后点击Windows builds from gyan.dev: 也可以直接点击 https://www.gyan.dev/ffmpeg ...
- MinIO对接k8s使用
文档地址:https://github.com/minio/operator/blob/master/README.md https://docs.min.io/minio/k8s/deploymen ...
- Kubernetes的kubectl常用命令速记
文章转载自:https://mp.weixin.qq.com/s/0kqQzeA-MzCOhPMkmiR4_A kubectl是用来管理Kubernetes集群的命令行工具. kubectl默认在&q ...
- K8S ingress控制器
文章转载自: K8S ingress控制器 (一)https://blog.51cto.com/u_13760351/2728917 K8S ingress控制器 (二)https://blog.51 ...
- MongoDB 副本集的用户和权限一般操作步骤
步骤总结: 在主节点上添加超管用户,副本集会自动同步 按照仲裁者.副本节点.主节点的先后顺序关闭所有节点服务 创建副本集认证的key文件,复制到每个服务所在目录 修改每个服务的配置文件,增加参数 启动 ...
- 浏览器的 JavaScript 控制台功能调试vue
原始显示结果: 调试其中一个变量的值: 页面上呈现出调试后的效果了