首页
Java
ActiveMQ
Maven
Spring
加密
多线程
设计模式
Netty
Tomcat
Java
SpringBoot
WebSocket
SpringBoot
SpringCloud
Eureka
Nacos
RocketMQ
Sentinel
Dubbo
Seata
前端
Html
Vue
Ueditor
Layui
Linux相关
Keepalived
Nginx
CentOS
Docker
中间件
Elasticsearch
FastDFS
Git
Jenkins
RabbitMQ
Zookeeper
数据库
Memcached
Mongodb
Oracle
MyBatis
MySQL
Redis
其他
Other
分布式系统
报错
浏览器
电脑相关
视频相关
首页
Java
ActiveMQ
Maven
Spring
加密
多线程
设计模式
Netty
Tomcat
Java
SpringBoot
WebSocket
SpringBoot
SpringCloud
Eureka
Nacos
RocketMQ
Sentinel
Dubbo
Seata
前端
Html
Vue
Ueditor
Layui
Linux相关
Keepalived
Nginx
CentOS
Docker
中间件
Elasticsearch
FastDFS
Git
Jenkins
RabbitMQ
Zookeeper
数据库
Memcached
Mongodb
Oracle
MyBatis
MySQL
Redis
其他
Other
分布式系统
报错
浏览器
电脑相关
视频相关
首页
[TOC] # Java8 Stream API Java 8 引入了全新的 Stream API,可以使用声明的方式来处理数据,极大地方便了集合操作,让我们可以使用更少的代码来实现更为复杂的逻辑,本文主要对一些常用的Stream API进行介绍。 ## 1、什么是Stream? Stream(流)是一个来自数据源的元素队列,它可以支持聚合操作。 - 数据源:流的数据来源,构造Stream对象的数据源,比如通过一个List来构造Stream对象,这个List就是数据源; - 聚合操作:对Stream对象进行处理后使得Stream对象返回指定规则数据的操作称之为聚合操作,比如filter、map、limit、sorted等都是聚合操作。 ## 2、Stream 聚合操作 ### 1、实体对象 ```java public class Permission implements Serializable { private Long id; private Long pid; private String name; private String value; private String icon; private Integer type; private String uri; private Integer status; private Date createTime; private Integer sort; private static final long serialVersionUID = 1L; } ``` ### 2、Stream对象的创建 Stream对象分为两种,一种串行的流对象,一种并行的流对象。 ```java // permissionList指所有权限列表 // 为集合创建串行流对象 Stream
stream = permissionList.stream(); // 为集合创建并行流对象 Stream
parallelStream = permissionList.parallelStream(); ``` ### 3、filter 对Stream中的元素进行过滤操作,当设置条件返回true时返回相应元素。 ```java // 获取权限类型为目录的权限 List
dirList = permissionList.stream() .filter(permission -> permission.getType() == 0) .collect(Collectors.toList()); ``` ### 4、map 对Stream中的元素进行转换处理后获取。比如可以将Permission对象转换成Long对象。 我们经常会有这样的需求:需要把某些对象的id提取出来,然后根据这些id去查询其他对象,这时可以使用此方法。 ```java // 获取所有权限的id组成的集合 List
idList = permissionList.stream() .map(permission -> permission.getId()) .collect(Collectors.toList()); ``` ### 5、limit 从Stream中获取指定数量的元素。 ```java // 获取前5个权限对象组成的集合 List
firstFiveList = permissionList.stream() .limit(5) .collect(Collectors.toList()); ``` ### 6、count 仅获取Stream中元素的个数。 ```java // count操作:获取所有目录权限的个数 long dirPermissionCount = permissionList.stream() .filter(permission -> permission.getType() == 0) .count(); ``` ### 7、sorted 对Stream中元素按指定规则进行排序。 ```java // 将所有权限按先目录后菜单再按钮的顺序排序 List
sortedList = permissionList.stream() .sorted((permission1,permission2)->{return permission1.getType().compareTo(permission2.getType());}) .collect(Collectors.toList()); ``` ### 8、skip 跳过指定个数的Stream中元素,获取后面的元素。 ```java // 跳过前5个元素,返回后面的 List
skipList = permissionList.stream() .skip(5) .collect(Collectors.toList()); ``` ### 9、用collect方法将List转成map 有时候我们需要反复对List中的对象根据id进行查询,我们可以先把该List转换为以id为key的map结构,然后再通过map.get(id)来获取对象,这样比较方便。 ```java // 将权限列表以id为key,以权限对象为值转换成map Map
permissionMap = permissionList.stream() .collect(Collectors.toMap(permission -> permission.getId(), permission -> permission)); ``` ```java @Data @AllArgsConstructor @NoArgsConstructor class User { private Integer userid; private String username; @Override public String toString() { return "User{" + "userid=" + userid + ", username='" + username + '\'' + '}'; } } List
userList = new ArrayList<>(); userList.add(new User(1L, "zhangsan")); userList.add(new User(2L, "lisi")); userList.add(new User(3L, "wangwu")); userList.add(new User(4L, "zhaoliu")); Map
map = userList.stream().collect(Collectors.toMap(User::getUserid, Function.identity(), (k1, k2) -> k1)); System.out.println(map); Map
map2 = userList.stream().collect(Collectors.toMap(User::getUserid, User::getUsername)); System.out.println(map2); //第一种(会出现键重复异常): //以id为主键转为map Map
map = list.stream().collect(Collectors.toMap(User::getId,Function.identity())); //第二种(针对第一种方法会出现情况): //给出key重复时,使用哪个key作为主键,以下代码中的(key1, key2) -> key2)代表key1和key2键重复时返回key2做主键 Map
map = list.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key2)); //第三种(只返回对象里某个属性时): // 不想返回对象,只返回对象里某个属性时 采用这种方式 Map
map2 = userList.stream().collect(Collectors.toMap(User::getUserid, User::getUsername)); Map
map = list.stream().collect(Collectors.toMap(User::getId, User::getUsername, (key1, key2) -> key2)); //第四种(以某个属性分组): Map
map = list.stream().collect(Collectors.groupingBy(User::getId)); ```
Java8
Stream
2022-08-30 00:26
Copyright © 2020 千夕网
粤公网安备 44030302001408号
粤ICP备19099833号-1