java8 Stream API 与常用方法

java8 Stream API

Stream 流

  1. Stream(流)是一个来自数据源的元素簇,它可以支持聚合操作。
  2. 数据源:流的数据源,构造流对象的数据源,例如通过一个List来构造Stream对象,这个List就是数据源;
  3. 聚合操作:对Stream对象进行处理后的Stream对象返回指定规则数​​据的操作称为聚合操作,过滤器,映射,限制,排序等都是聚合操作。

创建个实体类

 public class UmsPermission implements Serializable {
    private Long id;

    @ApiModelProperty(value = "父级权限id")
    private Long pid;

    @ApiModelProperty(value = "名称")
    private String name;

    @ApiModelProperty(value = "权限值")
    private String value;

    @ApiModelProperty(value = "图标")
    private String icon;

    @ApiModelProperty(value = "权限类型:0->目录;1->菜单;2->按钮(接口绑定权限)")
    private Integer type;

    @ApiModelProperty(value = "前端资源路径")
    private String uri;

    @ApiModelProperty(value = "启用状态;0->禁用;1->启用")
    private Integer status;

    @ApiModelProperty(value = "创建时间")
    private Date createTime;

    @ApiModelProperty(value = "排序")
    private Integer sort;

    private static final long serialVersionUID = 1L;

    //省略所有getter及setter方法
}

创建流

//创建list
List<UmsPermission> permissionList = new ArrayList();
// 为集合创建串行流对象
Stream<UmsPermission> stream = permissionList.stream();
// 为集合创建并行流对象
Stream<UmsPermission> parallelStream = permissionList.parallelStream();

filter 过滤

filter 主要是做筛选用 filte括号里面结果满足返回true 不满足返回false,返回结果为return true筛选后的结果

// 获取权限类型为目录的权限
// permission 为permissionList中每一个对象 
// permission.getType() 获取type判断type是否为1 返回数据为type=1的对象
List<UmsPermission> dirList = permissionList.stream()
    .filter(permission -> permission.getType() == 0)
    .collect(Collectors.toList());

// 第二种写法
List<UmsPermission> dirList = permissionList.stream()
                .filter( permission -> {
                    if (permission.getType() == 0){
                        return true;
                    }
                    return false;
                }).collect(Collectors.toList());

map 筛选

map为获取map括号里面return 出来的值

// 获取所有权限的id组成的集合
List<Long> idList = permissionList.stream()
    .map(permission -> permission.getId())
    .collect(Collectors.toList());
//第二种写法
List<Integer> list = permissionList.stream()
                .map(permission -> {
                    return permission.getId();
                }).collect(Collectors.toList());

limit 获取指定数量元素

从Stream中获取指定数量的元素。

// 获取前3个权限对象组成的集合
List<UmsPermission> firstFiveList = permissionList.stream()
    .limit(3)
    .collect(Collectors.toList());

skip 跳过指定下标

跳过指定位置的元素

// 跳过前5个元素,返回后面的
List<UmsPermission> skipList = permissionList.stream()
    .skip(5)
    .collect(Collectors.toList());

count 获取总数

// count操作:获取所有目录权限的个数
long dirPermissionCount = permissionList.stream()
    .filter(permission -> permission.getType() == 0)
    .count();

sorted 排序

sorted 排序 括号中返回的为 -1 0 1

  // 将所有权限按先目录后菜单再按钮的顺序排序
  //默认正序
   List<UmsPermission> sortedList = permissionList.stream()
   		.sorted(Comparator.comparing(UmsPermission::getType)).collect(Collectors.toList());
   //倒序 reversed
   List<UmsPermission> sortedList = permissionList.stream()
   		.sorted(Comparator.comparing(UmsPermission::getType).reversed()).collect(Collectors.toList());
  
  //第二种写法 正序
List<UmsPermission> sortedList = permissionList.stream()
	//permission1 下一个元素的值 permission2 当前元素的值
    .sorted((permission1,permission2)->{
    	//compareTo对比方法介绍
    	//permission1.getType() 小于 permission2.getType() 返回 -1 正序
    	//permission1.getType() 等于 permission2.getType() 返回 0 不排序
    	//permission1.getType() 大于 permission2.getType() 返回 1 倒序
    	return permission1.getType().compareTo(permission2.getType());})
    .collect(Collectors.toList());
 
 

distinct 去重

去重用的 具体怎么用还没看 现在记录一下 以后补充

在这里插入代码片

Collectors 方法

能返回 Collectors 中的所以集合

 // 对象转Map<Long,UmsPermission> 类型 key:id ,value:对象
 Map<Long, UmsPermission> permissionMap = permissionList.stream()
                .collect(Collectors.toMap(permission -> permission.getId(), permission -> permission ));
 
 // map中key重复用这个加(oldValue, newValue) -> newValue 的方法
 Map<Long, UmsPermission> permissionMap = permissionList.stream()
                .collect(Collectors
                  		//(oldValue, newValue) -> newValue  的作用是当出现一样的key值得时候如何取舍其中oldValue代表已存在map中的值,newValue代表新值(当前值),示例中取旧值(toMap key重复会报错) 当前取值为newValue(当前value覆盖原来map中的值)
                		.toMap(permission -> permission.getId(), permission -> permission ,(oldValue,newValue)-> newValue));
      
 //转换为List<Map<String,Object>>
 List<Map<String,Object>> collect = permissionList.stream()
 		.map(permission -> new BeanMap(permission))
 		.collect(Collectors.toList());  

 //转换为Set<Map<String,Object>>
 Set<Map<String,Object>> collect = permissionList.stream()
 		.map(permission -> new BeanMap(permission))
 		.collect(Collectors.toSet());
        		

List<String> 转map

 public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Mohan");
        list.add("Sohan");
        list.add("Mahesh");
        Map<String, Object> map = list.stream().collect(Collectors.toMap(Function.identity(),s->0));
        map.forEach((x, y) -> System.out.println("Key: " + x +", value: "+ y));

      //或者
        Map<String, Integer> mapp = list.stream().collect(Collectors.toMap(Function.identity(), s -> BigDecimal.ZERO.intValue()));
        mapp.forEach((x, y) -> System.out.println("Key: " + x +", value: "+ y));
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值