简单方便的集合处理

简单方便的集合处理–java8 stream流

背景

java 8已经发行好几年了,前段时间java 12也已经问世,但平时的工作中,很多项目的环境还停留在java1.7中。而且java8的很多新特性都是革命性的,比如各种集合的优化、lambda表达式等,所以我们还是要去了解java8的魅力。
今天我们来学习java8的Stream,并不需要理论基础,直接可以上手去用。
我接触stream的原因,是我要搞一个用户收入消费的数据分析。起初的统计筛选分组都是打算用sql语言直接从mysql里得到结果来展现的。但在操作中我们发现这样频繁地访问数据库,性能会受到很大的影响,分析速度会很慢。所以我们希望能通过访问一次数据库就拿到所有数据,然后放到内存中去进行数据分析统计过滤。
接着,我看了stream的API,发现这就是我想要的。

一. Stream理解

在java中我们称Stream为『流』,我们经常会用流去对集合进行一些流水线的操作。stream就像工厂一样,只需要把集合、命令还有一些参数灌输到流水线中去,就可以加工成得出想要的结果。这样的流水线能大大简洁代码,减少操作。

二、Stream流程

Stream流的操作流程一般都是这样的,先将集合转为流,然后经过各种操作,比如过滤、筛选、分组、计算。最后的终端操作,就是转化成我们想要的数据,这个数据的形式一般还是集合,有时也会按照需求输出count计数。下文会一一举例。

简单方便的集合处理_第1张图片

三、API功能举例

首先,定义一个用户对象,包含姓名、年龄、性别和籍贯四个成员变量:

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Log4j
@Builder
public class User {
//姓名
private String name;
//年龄
private Integer age;
//性别
private Integer sex;
//所在省市
private String address;
}
这里用lombok简化了实体类的代码。

然后创建需要的集合数据,也就是源数据:

//1.构建我们的list
List list= Arrays.asList(
new User(“钢铁侠”,40,0,“华盛顿”),
new User(“蜘蛛侠”,20,0,“华盛顿”),
new User(“赵丽颖”,30,1,“湖北武汉市”),
new User(“詹姆斯”,35,0,“洛杉矶”),
new User(“李世民”,60,0,“山西省太原市”),
new User(“蔡徐坤”,20,1,“陕西西安市”),
new User(“葫芦娃的爷爷”,70,0,“山西省太原市”)
);
3.1 过滤
1)创建流 stream() / parallelStream()

  • stream() : 串行流
  • parallelStream(): 并行流

2)filter 过滤(T-> boolean)

比如要过滤年龄在40岁以上的用户,就可以这样写:
List filterList = list.stream().filter(user -> user.getAge() >= 40)
.collect(toList());
filter里面,->箭头后面跟着的是一个boolean值,可以写任何的过滤条件,就相当于sql中where后面的东西,换句话说,能用sql实现的功能这里都可以实现

打印结果:
在这里插入图片描述
3)distinct 去重
和sql中的distinct关键字很相似。为了看到效果,此处在原集合中加入一个重复的人,就选择钢铁侠吧,复联4钢铁侠不幸遇害,大家还是比较伤心的。

List list= Arrays.asList(
new User(“钢铁侠”,40,0,“华盛顿”),
new User(“钢铁侠”,40,0,“华盛顿”),
new User(“蜘蛛侠”,20,0,“华盛顿”),
new User(“赵丽颖”,30,1,“湖北武汉市”),
new User(“詹姆斯”,35,0,“洛杉矶”),
new User(“李世民”,60,0,“山西省太原市”),
new User("蔡徐坤”,18,1,“陕西西安市”),
new User(“葫芦娃的爷爷”,70,0,“山西省太原市”)
);
复制代码//distinct 去重
List distinctList = filterList.stream().distinct()
.collect(toList());
在这里插入图片描述

4)sorted排序
如果流中的元素的类实现了 Comparable 接口,即有自己的排序规则,那么可以直接调用 sorted() 方法对元素进行排序,如:

Comparator.comparingInt

反之, 需要调用 sorted((T, T) -> int) 实现 Comparator 接口。

//sorted()
List sortedList = distinctList.stream().sorted(Comparator.comparingInt(User::getAge))
.collect(toList());

在这里插入图片描述

5)limit() 返回前n个元素

如果想知道这里面年龄最小的是谁,可作如下操作:

//limit 返回前n个元素
List limitList = sortedList.stream().limit(1)
.collect(toList());

在这里插入图片描述

6)skip()
与limit恰恰相反,skip的意思是跳过,也就是去除前n个元素。

打印结果:

在这里插入图片描述
果然,前两个人都被去除了,只剩下最老的葫芦娃爷爷。

你可能感兴趣的:(JAVA)