Stream流的一些操作
这段时间在项目开发中使用到Java8 的 Stream流操作发现真的特别方便,这里总结了一些常用的stream流操作.
1 简介
在使用Stream流之前先来简单介绍一下:
1 Stream事java8才提供的一种以流的方式来处理数据集的一种手段,凡是属于Collection接口之下的所有字类或者子接口都可以使用Collection.stream()方法来获取到一个流对象;
2 Java8的API有提到过每一个Colection的Stream流只能执行一次,如果想要再次执行只能重现创建,因为Stream流默认会在执行后自动关闭流
(这一点查看API可以发现其实Stream接口extends了BaseStream接口,而BaseStream接口又extends了AutoColseable接口,所以不需要我们每次使用之后手动关闭流)
3 Stream屏蔽了直接操作集合中某一个元素的遍历方式,而是更关心对元素集合的聚合操作计算(比如分组,求和,排序,筛选等操作);
4 虽然不能直接操作某一个元素,但是我们可以使用BaseStream.iterator()方法对每一个元素进行迭代,使用BaseStream.spliterator()方法对元素的拼接操作等;
如果看API可能会觉得有点懵逼,但是其实我们可以简单的进行理解
Stream就是提供了一种对Collection集合中元素进行聚合操作的一种工具,我们使用Stream流可以完成SQL层面上几乎所有聚合函数操作,以及过滤等操作;
使用Stream流避免了我们使用循环去操作元素然后进行聚合的麻烦;
大致就是这个意思,如果你使用Stream流的时候得心应手,对你的代码效率和时间效率都会大大提高,所以在操作集合元素之前首先考虑能不能使用Stream流来完成是一个不错的选择,可能会避免你出现很多错误;
当然如果你jdk不支持当我没说!!!
2 常用操作
常用操作就不再一一举例子和详细说明了,都是API我就只写例子,只要有点java基础的一看就能明白什么意思
2.1 根据某一字段分组
Map<String, List<IotHzsStB>> listMap = list.stream().collect(Collectors.groupingBy(IotHzsStB::getSttp));
2.2 抽取某一个字段
List<Long> collect = menuList.stream().map(SysMenu::getId).collect(Collectors.toList());
2.3 过滤
Long tYellAlarmNum = iotAlarmS.stream().filter(item -> item.getAlarmType().equals(ConstantEnum.IOT_ALARM_TYPE_1.getValue())).filter(item -> item.getLevel().equals(ConstantEnum.IOT_ALARM_LEVEL_0.getValue())).count();
2.4 排序(多字段)
returnList = returnList.stream().sorted(Comparator.comparing(IotPpJcResponse::getDrp,Comparator.reverseOrder()).thenComparing(IotPpJcResponse::getAddvcd,Comparator.reverseOrder())).collect(Collectors.toList());
2.5 取出第一个集合中第一个元素
list.stream().findFirst().get();
2.6 是否匹配(有一个匹配就是true)
boolean isAdmin = sysUserRoleList.stream().anyMatch(r -> "admin".equalsIgnoreCase(r.getRoleCode()));
2.7 是否匹配(所有元素都匹配返回true)
boolean isAdmin = sysUserRoleList.stream().allMatch(r -> "admin".equalsIgnoreCase(r.getRoleCode()));
2.8 是否匹配(都不匹配返回true)
boolean isAdmin = sysUserRoleList.stream().noneMatch(r -> "admin".equalsIgnoreCase(r.getRoleCode()));
3 结束语
标签:常用,stream,Stream,元素,接口,使用,操作 From: https://www.cnblogs.com/mrkay/p/18006064暂时就这么多吧 ,因为这几个见到的次数比较多一点,当然还有很多常用操作没有记录,后期遇到再进行补充
上面有的操作可能涉及好多个子操作,比如过滤中使用到了count()统计等等。