首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下

2020-01-07

数据处理演示。

@Test
public void streamDemo{
List String nameList = Arrays.asList;
// 1. 挑选知姓名长度为4的
// 2. 姓名前面拼接 This is
// 3. 遍历输出
nameList.stream
.filter == 4)
.map
.forEach);
}
// 输出成果
// This is Jack
// This is Poul
数据处理/转化 操作天然不止是上面演示的过滤  filter 和  map 映射两种,别的还有 map 、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered 等。

数据处理演示。

@Test
public void streamDemo{
List String nameList = Arrays.asList;
// 1. 挑选知姓名长度为4的
// 2. 姓名前面拼接 This is
// 3. 遍历输出
nameList.stream
.filter == 4)
.map
.forEach);
}
// 输出成果
// This is Jack
// This is Poul














常见的 成果处理 操作有 forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator 等。

/**
* 转化成为大写然后搜集成果,遍历输出
*/
@Test
public void toUpperCaseDemo {
List String nameList = Arrays.asList;
List String upperCaseNameList = nameList.stream
.map
.collect);
upperCaseNameList.forEach);
}
// 输出成果
// DARCY,CHRIS,LINDA,SID,KIM,JACK,POUL,PETER,
2.4. short-circuiting 有一种 Stream 操作被称作 short-circuiting ,它是指当 Stream 流 无限大 可是需求回来的 Stream 流是 有限 的时分,而又期望它能在 有限的时刻 内核算出成果,那么这个操作就被称为 short-circuiting 。例如 findFirst 操作。

/**
* 转化成为大写然后搜集成果,遍历输出
*/
@Test
public void toUpperCaseDemo {
List String nameList = Arrays.asList;
List String upperCaseNameList = nameList.stream
.map
.collect);
upperCaseNameList.forEach);
}
// 输出成果
// DARCY,CHRIS,LINDA,SID,KIM,JACK,POUL,PETER,













3.1. Stream 流获取

获取 Stream 的几种办法在上面的 Stream 数据源里现已介绍过了,下面是针对上面介绍的几种获取 Stream 流的运用示例。

@Test
public void createStream throws FileNotFoundException {
List String nameList = Arrays.asList;
String[] nameArr = { Darcy , Chris , Linda , Sid , Kim , Jack , Poul , Peter };
// 调集获取 Stream 流
Stream String nameListStream = nameList.stream;
// 调集获取并行 Stream 流
Stream String nameListStream2 = nameList.parallelStream;
// 数组获取 Stream 流
Stream String nameArrStream = Stream.of;
// 数组获取 Stream 流
Stream String nameArrStream1 = Arrays.stream;
// 文件流获取 Stream 流
BufferedReader bufferedReader = new BufferedReader);
Stream String linesStream = bufferedReader.lines;
// 从静态办法获取流操作
IntStream rangeStream = IntStream.range;
rangeStream.limit.forEach);
System.out.println;
IntStream intStream = IntStream.of;
intStream.forEach);
}
3.2. forEach forEach 是  Stream 流中的一个重要办法,用于遍历  Stream 流,它支撑传入一个规范的  Lambda 表达式。可是它的遍历不能通过 return/break 进行停止。一起它也是一个  terminal 操作,履行之后  Stream 流中的数据会被消费掉。

获取 Stream 的几种办法在上面的 Stream 数据源里现已介绍过了,下面是针对上面介绍的几种获取 Stream 流的运用示例。

@Test
public void createStream throws FileNotFoundException {
List String nameList = Arrays.asList;
String[] nameArr = { Darcy , Chris , Linda , Sid , Kim , Jack , Poul , Peter };
// 调集获取 Stream 流
Stream String nameListStream = nameList.stream;
// 调集获取并行 Stream 流
Stream String nameListStream2 = nameList.parallelStream;
// 数组获取 Stream 流
Stream String nameArrStream = Stream.of;
// 数组获取 Stream 流
Stream String nameArrStream1 = Arrays.stream;
// 文件流获取 Stream 流
BufferedReader bufferedReader = new BufferedReader);
Stream String linesStream = bufferedReader.lines;
// 从静态办法获取流操作
IntStream rangeStream = IntStream.range;
rangeStream.limit.forEach);
System.out.println;
IntStream intStream = IntStream.of;
intStream.forEach);
}






















如输出目标。

List Integer numberList = Arrays.asList;
numberList.stream.forEach);
// 输出成果
// 1,2,3,4,5,6,7,8,9,




/**
* 把数字值乘以2
*/
@Test
public void mapTest {
List Integer numberList = Arrays.asList;
// 映射成 2倍数字
List Integer collect = numberList.stream
.map
.collect);
collect.forEach);
System.out.println;

numberList.stream
.map
.forEach);
}
// 输出成果
// 2,4,6,8,10,12,14,16,18,
// 数字 1,数字 2,数字 3,数字 4,数字 5,数字 6,数字 7,数字 8,数字 9,
上面的 map 能够把数据进行一对一的映射,而有些时分联系或许不止 1对 1那么简略,或许会有1对多。这时能够运用  flatMap。下面演示 运用  flatMap 把目标扁平化打开。

/**
* 把数字值乘以2
*/
@Test
public void mapTest {
List Integer numberList = Arrays.asList;
// 映射成 2倍数字
List Integer collect = numberList.stream
.map
.collect);
collect.forEach);
System.out.println;

numberList.stream
.map
.forEach);
}
// 输出成果
// 2,4,6,8,10,12,14,16,18,
// 数字 1,数字 2,数字 3,数字 4,数字 5,数字 6,数字 7,数字 8,数字 9,




















/**
* flatmap把目标扁平化
*/
@Test
public void flatMapTest {
Stream List Integer inputStream = Stream.of,
Arrays.asList,
Arrays.asList
);
List Integer collect = inputStream
.flatMap - childList.stream)
.collect);
collect.forEach);
}
// 输出成果
// 1,2,3,4,5,6,
















/**
* filter 数据挑选
* 挑选出偶数数字
*/
@Test
public void filterTest {
List Integer numberList = Arrays.asList;
List Integer collect = numberList.stream
.filter
.collect);
collect.forEach);
}

得到如下成果。

2,4,6,8,
3.5. findFirst findFirst 能够查找出  Stream 流中的第一个元素,它回来的是一个 Optional 类型,假如还不知道 Optional 类的用途,能够参阅之前文章  Jdk14都要出了,还不能运用 Optional高雅的处理空指针? 。

/**
* filter 数据挑选
* 挑选出偶数数字
*/
@Test
public void filterTest {
List Integer numberList = Arrays.asList;
List Integer collect = numberList.stream
.filter
.collect);
collect.forEach);
}












得到如下成果。

2,4,6,8,

/**
* 查找第一个数据
* 回来的是一个 Optional 目标
*/
@Test
public void findFirstTest{
List Integer numberList = Arrays.asList;
Optional Integer firstNumber = numberList.stream
.findFirst;
System.out.println);
}
// 输出成果
// 1













3.6. collect / toArray Stream 流能够轻松的转化为其他结构,下面是几种常见的示例。

 /**
* Stream 转化为其他数据结构
*/
@Test
public void collectTest {
List Integer numberList = Arrays.asList;
// to array
Integer[] toArray = numberList.stream
.toArray;
// to List
List Integer integerList = numberList.stream
.collect);
// to set
Set Integer integerSet = numberList.stream
.collect);
System.out.println;
// to string
String toString = numberList.stream
.map)
.collect).toString;
System.out.println;
// to string split by ,
String toStringbJoin = numberList.stream
.map)
.collect).toString;
System.out.println;
}
// 输出成果
// [1, 2, 3, 4, 5]
// 112233445
// 1,1,2,2,3,3,4,4,5































获取或许丢掉前 n 个元素

/**
* 获取 / 丢掉前 n 个元素
*/
@Test
public void limitOrSkipTest {
// 生成自己的随机数流
List Integer ageList = Arrays.asList;
ageList.stream
.limit
.forEach);
System.out.println;

ageList.stream
.skip
.forEach);
}
// 输出成果
// 11,22,13,
// 14,25,26,



















数学核算功用,求一组数组的最大值、最小值、个数、数据和、平均数等。

/**
* 数学核算测验
*/
@Test
public void mathTest {
List Integer list = Arrays.asList;
IntSummaryStatistics stats = list.stream.mapToInt.summaryStatistics;
System.out.println);
System.out.println);
System.out.println);
System.out.println);
System.out.println);
}
// 输出成果
// 最小值:1
// 最大值:6
// 个数:6
// 和:21
// 平均数:3.5



















分组聚合功用,和数据库的 Group by 的功用共同。

/**
* groupingBy
* 按年纪分组
*/
@Test
public void groupByTest {
List Integer ageList = Arrays.asList;
Map String, List Integer ageGrouyByMap = ageList.stream
.collect));
ageGrouyByMap.forEach - {
System.out.println;
});
}
// 输出成果
// 年纪10多岁的有:[11, 13, 14]
// 年纪20多岁的有:[22, 25, 26]
















/**
* partitioningBy
* 按某个条件分组
* 给一组年纪,分出成年人和未成年人
*/
public void partitioningByTest {
List Integer ageList = Arrays.asList;
Map Boolean, List Integer ageMap = ageList.stream
.collect);
System.out.println);
System.out.println);
}
// 输出成果
// 未成年人:[11, 13, 14]
// 成年人:[22, 25, 26]















/**
* 生成自己的 Stream 流
*/
@Test
public void generateTest{
// 生成自己的随机数流
Random random = new Random;
Stream Integer generateRandom = Stream.generate;
generateRandom.limit.forEach;
// 生成自己的 UUID 流
Stream UUID generate = Stream.generate;
generate.limit.forEach;
}

// 输出成果
// 793776932
// -2051545609
// -917435897
// 298077102
// -1626306315
// 31277974-841a-4ad0-a809-80ae105228bd
// f14918aa-2f94-4774-afcf-fba08250674c
// d86ccefe-1cd2-4eb4-bb0c-74858f2a7864
// 4905724b-1df5-48f4-9948-fa9c64c7e1c9
// 3af2a07f-0855-455f-a339-6e890e533ab3

























热门文章

随机推荐

推荐文章