「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。
java的流处理
前文
本文为对于java中使用流式api操作数据的一些总结及个人理解,作为笔记式记录,难免有不足或错误之处。
流的具体内容
提到流处理,可能第一反应便是flink闻名于世的流式处理操作。在flink中,通过数据源、数据处理过程以及数据输出,构成了完整的流处理环节。而在Java中,同样有这样的一组api,达成了类似的效果:数据源、中间的多次操作以及终端操作。
下面具体来了解一下java中常用的一些流处理api以及相关的api。
- stream():主要是将列表等集合结构转化为流的api,相当于flink中的数据源处理。通过该操作可以将集合结构转为流数据,后续利用流处理api进行操作。
- filter():对流进行过滤的api,在调用时指定过滤的操作逻辑,可以得到经过过滤后的流数据。
- map():对于数据处理的api。利用逻辑对数据结构进行一定的转换操作,得到目标的数据结构。
- flatMap():可以理解为将流元素处理为新的流作为后续的流处理数据源。与之相对的map可以理解为不对流进行改变,只是变更了流中的对应元素。
- distinct():利用hashcode进行区分,移除流中数据的重复项。
- sorted():对流中的数据进行排序,可以指定排序方法。
- peek():在操作的每个节点进行流数据的查看。
- limit():将流截取为指定的长度。
- skip():跳过部分数据后剩余数据组成的流。
- forEach():对流数据的遍历处理。
- reduce():对流数据进行聚合操作。
- collect():对流数据的结果进行收集操作。 以上只是列出了一些常用的操作,流处理操作的api还有很多,需要时可以查阅文档学习。很明显,上述的这些api与flink中操作的api有很多异曲同工之处。
最后看一个简单的流处理代码:
serviceParaList.forEach(functionServiceParaPO -> {
functionServiceParaPO.setRelationServiceId(
serviceList.stream().filter(functionServicePO -> functionServicePO.getPublicId().equals(functionServiceParaPO.getRelationServiceId())).map(functionServicePO->functionServicePO.getId()).collect(Collectors.toList()).get(0)
);
functionServiceParaPO.setCreateBy(BaseContext.getUserId());
});
对列表中的数据进行过滤,找到对应的结果后,将其中的某个字段进行修改。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。