2022更文挑战7-java的流处理

127 阅读2分钟

「这是我参与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());
});

对列表中的数据进行过滤,找到对应的结果后,将其中的某个字段进行修改。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。