网易首页 > 网易号 > 正文 申请入驻

今天,我们就站在Java的角度来聊一聊大数据的处理

0
分享至

什么是Stream非生产线示意处理图创建数据流流的使用机制(重要事项)流的执行顺序转换处理合并处理(reduce)总结

大家好,我是指北君,在如今的大数据时代,对于数据的生产线式的加工处理场景越来越多,Java8之前对于这种类型的数据处理是显得有些笨拙的,代码繁多臃肿(过多的中间过程变量和过程),显得不够优雅和简洁。在Java8引入Stream包后,我们就可以得心应手地应付这种场景。

不知道有玩过异星工厂的伙伴没,给一张图

生产线

Stream就像处理生产流水线一样去工作,传送带就是Stream的管道,每个工厂关注直接的生产,将上游产品加工成下游需要的产品。为什么Stream比传统的处理方式好呢?我们都知道,传统的处理中,每一步我们都需要通过循环控制,逻辑控制,解包,重新装箱这些工作。

这些步骤让我们的程序的业务逻辑支离破碎,经常处理数据类的小伙伴尤为痛苦。幸运的是,Java8为我们引入了Stream,使用Stream后我们只关注数据处理逻辑,其他的事情交给流处理对应的方法来完成。

指北君先为大家介绍如何创建Stream,这里有非常多的方式,需要注意一点就是:流一旦创建后,修改创建的源不会影响已经创建的Stream中的数据。

  1. 空流 为了避免出现空指针异常,系统提供一个静态方法提供空流。

public void createStream() {
Stream myStream = Stream.empty();

  1. 通过数组对象创建流

public void createStream() {
Integer[] arr = new Integer[]{1,2,3};
Stream stream1 = Arrays.stream(arr);
Stream stream2 = Arrays.stream(arr, 0, 2);

  1. 通过集合对象创建流

public void createStream() {
Collection collection = Arrays.asList("a", "b", "c");
Stream stream1 = collection.stream();

支持多种集合:List,Set,Map等实现了Collection接口的集合对象。

  1. 通过builder创建

public void createStream() {
Stream stream1 =
Stream.builder().add(1L).add(2L).add(3L).build();

  1. 通过generate生成

public void createStream() {
Random r = new Random();
Stream stream =
Stream.generate(() -> r.nextLong()).limit(10);

按照提供给generate的Supplier逻辑生成数据,通过limit限制生成的数据量

  1. 通过Stream.iterate创建

public void createStream() {
Stream stream = Stream.iterate(1, n -> n * n).limit(20);

iterate提供两种方法来满足我们比较常用的迭代生成逻辑

  • iterate(final T seed, final UnaryOperatorf)
  • iterate(T seed, Predicate hasNext, UnaryOperatornext)
  1. 原生类型生成 通过对应的IntStream,LongStream,DoubleStream类中提供的方法来获取,包含常用的方法
  • builder()
  • empty()
  • of()
  • iterate()
  • generate()
  • range()
  • concat()
  1. 其他地方 这里介绍两处:字符分割匹配和文件行数据

String.chars()返回IntStream
Files.lines()返回通过行分割的字符内容

我们通过上面的方法创建好流后,就可以对流进行相关的业务逻辑处理了,需要注意:如果我们重复对一个流进行操作,就会出错,系统会爆出IllegalStateException异常,这是因为Stream设计为不可重用的模式。流的下一个环节都是对当前环节处理后新生成流的处理。

采用Stream方式进行多个逻辑处理时,他们之间的执行顺序是什么样的呢?指北君为了展示效果,写了一段测试代码:

public void exeOrder() {
List list = Arrays.asList("data_1","data_2", "data_3", "data_12");
list.stream().filter(x -> {
System.out.println("filter() was called: " + x);
return x.contains("2");
}).map(x -> {
System.out.println("map() was called: " + x);
return x.toUpperCase();
}).forEach(x->System.out.println("forEach() was called: " + x));

执行结果如下:
filter() was called: data_1
filter() was called: data_2
map() was called: data_2
forEach() was called: data_2
filter() was called: data_3
filter() was called: data_12
map() was called: data_12
forEach() was called: data_12

从示例代码的打印的顺序中我们可以发现:流处理的顺序不是以代码顺序(执行完一步再到下一步),而是按照数据处理完一个单位数据的所有环节再处理下一个数据,见下面的动态示意图:

Stream处理顺序

既然我们了解流的处理顺序,也能理解某些流操作会提前结束流处理的,比如findFirst(),在处理完第一个符合条件的数据后,后续的数据不会参与任何一个环节的处理。

转换处理时最常用的逻辑处理方式,介绍转换处理的文章较多,这里不再一一详细描述只是简单列一下,转换处理对应大数据MapReduce中的Map处理

  1. distinct剔重
  2. filter过滤
  3. map转换映射
  4. peek
  5. limit
  6. skip

对于Map-Reduce模型的reduce操作,国内对这个词翻译不太统一,指北君就先称之为合并处理吧。这里介绍两个方法reduce和collect

  1. reduce 先来看一个reduce的示例

public void reduce() {
int sum = IntStream.range(1, 100).reduce(0, (a, b) -> a + b);
System.out.print(sum);

合并Stream中的所有值,合并的初始值为0,如果初始为0还可以省略初始值。reduce函数包含三部分关键信息:

  • 初始值,指定合并操作的初始值
  • 合并函数
  • 合路器(函数),在并行(多线程)运算时需要用到

下面是一个使用合路器的示例,在并行运算时使用。

public void parallelReduce() {
int sum = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).parallelStream()
.reduce(0, (a, b) -> a + b, (a, b) -> {
return a + b;
System.out.println(sum);

这里指北君留一道思考题给大家,如果这里初始值0修改为10,最终的结果是多少?为什么是这种结果呢?

  1. collect 现在我们再来看collect,collect严格上说是reduce有些牵强,因为是否reduce在于collect中的执行逻辑 比如这段:

List collector = list.stream().map(Product::getName).collect(Collectors.toList());

然后再看下面的例子:

String mergString = list.stream().map(Product::getName).collect(Collectors.joining(", ", "[", "]"));

还有其他对应的方法:

  • Collectors.averagingInt
  • Collectors.summingInt
  • Collectors.groupingBy
  • Collectors.partitioningBy

各位小伙伴可以查看Collectors对应的API,这里就不一一列举了,总之,collect通过Collectors对象的API类完成合并处理。

关于Java的Stream的常用知识指北君就给大家分享到这,相关的重点知识都有提及,但未太深入剖析,比如Stream的并发处理是如何执行的等等,这些知识点留待后续指北君为大家分享。

最后感谢各位人才的:点赞、收藏和评论,我们下期更精彩。

转自公众号:Java极客技术

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
惨不忍睹!山东一女股民349元买中国中兔死守3年,结果跌到了71元

惨不忍睹!山东一女股民349元买中国中兔死守3年,结果跌到了71元

股海风云大作手
2024-06-01 21:35:23
4年2.21亿!美元唐斯超级顶薪合同新季生效 末年年薪6119万

4年2.21亿!美元唐斯超级顶薪合同新季生效 末年年薪6119万

直播吧
2024-06-01 19:46:15
内需外需难以改善,五月经济景气继续回落,制造业重回收缩区

内需外需难以改善,五月经济景气继续回落,制造业重回收缩区

火星宏观
2024-06-01 13:20:02
黄仁勋访台言论踩红线,称台湾为“国家”,据称与赖清德愿景相同

黄仁勋访台言论踩红线,称台湾为“国家”,据称与赖清德愿景相同

说天说地说实事
2024-06-01 21:27:37
笑不活了!六一学校义卖活动结束后,家长:这才是高端捡漏啊!

笑不活了!六一学校义卖活动结束后,家长:这才是高端捡漏啊!

今日搞笑分享
2024-06-01 20:50:54
俄罗斯已成为世界第四大经济体

俄罗斯已成为世界第四大经济体

俄罗斯卫星通讯社
2024-06-01 16:05:07
不要随地“交配”交配人在做,天眼在看!

不要随地“交配”交配人在做,天眼在看!

水泥土的搞笑
2024-06-01 23:00:39
大事件!广发银行十多名高管被抓包括三任董事长!释放什么信号?

大事件!广发银行十多名高管被抓包括三任董事长!释放什么信号?

兵哥闲聊
2024-06-01 22:03:53
谭咏麟病愈后首次公开现身,瘦到青筋毕现感慨声线不好

谭咏麟病愈后首次公开现身,瘦到青筋毕现感慨声线不好

小萝卜天下事
2023-07-21 21:57:53
惩戒赖清德当局,大陆砍关税减让丨湾区望海峡

惩戒赖清德当局,大陆砍关税减让丨湾区望海峡

直新闻
2024-06-01 22:37:03
考辛斯生涯首冠:率云豹4-0夺队史首冠 场均25+16获FMVP

考辛斯生涯首冠:率云豹4-0夺队史首冠 场均25+16获FMVP

醉卧浮生
2024-06-01 18:15:45
对话当事人|被希尔顿“扣罚”3000元顾客:我是7年钻卡会员,说我是黄牛房贩子,请拿出凭据

对话当事人|被希尔顿“扣罚”3000元顾客:我是7年钻卡会员,说我是黄牛房贩子,请拿出凭据

上游新闻
2024-06-01 18:32:09
犹太人布局百年的捞金大骗局,竟被河南人出手一招终结

犹太人布局百年的捞金大骗局,竟被河南人出手一招终结

爆角追踪
2024-06-01 17:03:00
保定交通大楼火灾后,知情人称财务室被烧毁,网友:有猫腻

保定交通大楼火灾后,知情人称财务室被烧毁,网友:有猫腻

三月柳
2024-06-01 15:30:08
1.5亿欧+才考虑!罗体:那不勒斯拒绝巴黎1.1亿欧对K77的报价

1.5亿欧+才考虑!罗体:那不勒斯拒绝巴黎1.1亿欧对K77的报价

直播吧
2024-06-01 16:24:05
“这里不是中国!不会有人惯你们!”中国大妈已经沦落成世界公害

“这里不是中国!不会有人惯你们!”中国大妈已经沦落成世界公害

三月柳
2024-06-01 15:24:12
鲍炳章,违规出入具有私人会所性质的场所,搞权色交易、钱色交易

鲍炳章,违规出入具有私人会所性质的场所,搞权色交易、钱色交易

新京报
2024-06-01 18:51:42
1179万大学生即将“涌向”社会,外卖、滴滴、快递员要更卷了!

1179万大学生即将“涌向”社会,外卖、滴滴、快递员要更卷了!

鬼谷子思维
2024-05-30 16:35:00
“中美防长会见”与“中方不出席乌克兰和平峰会”

“中美防长会见”与“中方不出席乌克兰和平峰会”

新民周刊
2024-06-01 11:05:29
以色列称:继续加沙战争“直至消灭哈马斯”

以色列称:继续加沙战争“直至消灭哈马斯”

参考消息
2024-06-01 13:54:11
2024-06-02 01:56:49
中国尊下的打工仔
中国尊下的打工仔
不定时更新Java知识
26文章数 165关注度
往期回顾 全部

科技要闻

余承东:不卷价格!雷军:将双班制生产!

头条要闻

小伙投资300万在瑞典开拉面馆生意火爆 1碗面卖100元

头条要闻

小伙投资300万在瑞典开拉面馆生意火爆 1碗面卖100元

体育要闻

女排最强2主攻合体 合砍40分打懵泰国

娱乐要闻

白玉兰提名:胡歌、范伟争视帝

财经要闻

实锤!普华永道,危!

汽车要闻

吉利银河E5 Flyme Auto智能座舱首发

态度原创

本地
教育
房产
健康
家居

本地新闻

食味印象|歙县限定!枇杷味儿的清甜初夏

教育要闻

父母吵架时,孩子在想什么?

房产要闻

重磅!琼海出台楼市新政:住房出租、挂牌计划出售,都可减套数!

晚餐不吃or吃七分饱,哪种更减肥?

家居要闻

风雅自来 中式的和谐平衡

无障碍浏览 进入关怀版