这段时间在项目开发中使用到Java8 的 Stream流操作发现真的特别方便,这里总结了一些常用的stream流操作.
在使用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不支持当我没说!!!
常用操作就不再一一举例子和详细说明了,都是API我就只写例子,只要有点java基础的一看就能明白什么意思
Map<String, List<IotHzsStB>> listMap = list.stream().collect(Collectors.groupingBy(IotHzsStB::getSttp));
List<Long> collect = menuList.stream().map(SysMenu::getId).collect(Collectors.toList());
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();
returnList = returnList.stream().sorted(Comparator.comparing(IotPpJcResponse::getDrp,Comparator.reverseOrder()).thenComparing(IotPpJcResponse::getAddvcd,Comparator.reverseOrder())).collect(Collectors.toList());
list.stream().findFirst().get();
boolean isAdmin = sysUserRoleList.stream().anyMatch(r -> "admin".equalsIgnoreCase(r.getRoleCode()));
boolean isAdmin = sysUserRoleList.stream().allMatch(r -> "admin".equalsIgnoreCase(r.getRoleCode()));
boolean isAdmin = sysUserRoleList.stream().noneMatch(r -> "admin".equalsIgnoreCase(r.getRoleCode()));
Map<String, Double> map = list.stream().collect(Collectors.toMap(NlKeyRiverResponse::getQtm, NlKeyRiverResponse::getZ));
Map<String, String> tempMap = list.stream().collect(Collectors.toMap(DictInfo::getDictLabel, DictInfo::getDictValue));
List<String> stcds = receiveDataList.stream().map(IotHzsPpR::getStcd).collect(Collectors.toList());
List<String> stcdList = stcds.stream().distinct().collect(Collectors.toList());
Map<String, List<Long>> collect = allCloudPics.stream().collect(Collectors.groupingBy(MetCloud::getCloudUrl, Collectors.mapping(MetCloud::getId, Collectors.toList())));
// BigDecimal
BigDecimal total = list.stream()
.map(IotCgRainDetail::getRainSumValue)
.reduce(BigDecimal.ZERO, BigDecimal::add);
// int double long
double max = list.stream().mapToDouble(IotCgRainDetail::getRainSumValue).sum();
暂时就这么多吧 ,因为这几个见到的次数比较多一点,当然还有很多常用操作没有记录,后期遇到再进行补充
上面有的操作可能涉及好多个子操作,比如过滤中使用到了count()统计等等
当然你也可以查看Java8 的API文档了解更多,随时用随时查看。
https://www.matools.com/api/java8