Item 优先选择流中没有副作用的函数

item 优先选择流中没有副作用的函数

流使用介绍:

新用户可能会发现很难在流管道中表达计算。streams 基于函数式编程,提供表现力、速度和并行化。

计算结构:

使用纯函数将结构计算作为转换序列。纯函数仅依赖于它们的输入,并且不改变状态。

副作用:

避免传递给流操作的函数产生副作用。不正确地使用改变外部状态的 foreach 是一种“难闻的气味”。

示例1:有副作用的代码

map freq = new hashmap();try (stream words = new scanner(file).tokens()) {    words.foreach(word -> {        freq.merge(word.tolowercase(), 1l, long::sum);    });}

问题:这段代码使用foreach来修改外部状态(freq)。它是迭代的并且不利用流。

示例2:无副作用的代码

map freq;try (stream words = new scanner(file).tokens()) {    freq = words.collect(collectors.groupingby(string::tolowercase, collectors.counting()));}

解决方案: 使用 collectors.groupingby 收集器创建频率表,而不改变外部状态。更短、更清晰、更高效。

流api的占用:

模仿迭代循环的代码没有利用流。使用收集器进行更高效和可读的操作。

收藏家:

简化将结果收集到列表和集合等集合中。collectors.tolist()、collectors.toset()、collectors.tocollection(collectionfactory).

示例 3:提取最常见的十个单词的列表

list topten = freq.entryset().stream()    .sorted(map.entry.comparingbyvalue().reversed())    .limit(10)    .map(map.entry::getkey)    .collect(collectors.tolist());

说明:

Seede AI Seede AI

AI 驱动的设计工具

Seede AI 586 查看详情 Seede AI 按值降序排列频率图条目。将直播限制为 10 个字。收集列表中最常见的单词。

收集器 api 的复杂性:

api 有 39 个方法,但很多都是供高级使用的。收集器可用于创建地图(tomap、groupingby)。

地图和收集攻略:

tomap(keymapper, valuemapper) 获取唯一的键值。使用合并功能处理按键冲突的策略。groupingby 根据分类器函数将元素分组。

示例4:使用带有合并功能的tomap

map freq;try (stream words = new scanner(file).tokens()) {    freq = words.collect(collectors.tomap(        string::tolowercase,         word -> 1l,         long::sum    ));}

说明:

tomap 将单词映射到它们的频率。合并函数(long::sum)通过对频率求和来处理关键冲突。

示例 5:按艺术家对专辑进行分组并查找最畅销的专辑

map topalbums = albums.stream()    .collect(collectors.tomap(        album::getartist,        function.identity(),        binaryoperator.maxby(comparator.comparing(album::sales))    ));

说明:

tomap 将艺术家映射到他们最畅销的专辑。binaryoperator.maxby 确定每个艺术家的最畅销专辑。

字符串集合:
collectors.joining 使用可选分隔符连接字符串。

示例 6:使用分隔符连接字符串

String result = Stream.of("came", "saw", "conquered")    .collect(Collectors.joining(", ", "[", "]"));

说明:

collectors.joining 以逗号作为分隔符、前缀和后缀连接字符串。结果:[来、看到、征服].

结论:

流的本质在于无副作用的函数。foreach 只能用于报告结果。有关收集器的知识对于有效使用流至关重要。

以上就是Item 优先选择流中没有副作用的函数的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1097333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 16:06:01
下一篇 2025年12月2日 16:06:23

相关推荐

发表回复

登录后才能评论
关注微信