我在某处读到过,流操作总是在终端操作时返回一个新集合,并且不会更改已应用流操作的原始集合。
但在我的情况下,原始列表已被修改。
return subscriptions.stream()
.filter(alertPrefSubscriptionsBO -> (alertPrefSubscriptionsBO.getType() == AlertPrefContactTypeEnum.PRIMARY_CONTACT || alertPrefSubscriptionsBO.getType() == AlertPrefContactTypeEnum.SECONDARY_CONTACT))
.map(alertPrefSubscriptionsBO -> {
if (alertPrefSubscriptionsBO.getType() == AlertPrefContactTypeEnum.PRIMARY_CONTACT) {
alertPrefSubscriptionsBO.setType(AlertPrefContactTypeEnum.PRIMARY);
} else
alertPrefSubscriptionsBO.setType(AlertPrefContactTypeEnum.SECONDARY);
return alertPrefSubscriptionsBO;
})
.collect(groupingBy(AlertPrefSubscriptionsBO::isActiveStatus, groupingBy(AlertPrefSubscriptionsBO::getAlertLabel, Collectors.mapping((AlertPrefSubscriptionsBO o) -> o.getType()
.getContactId(), toSet())
)));
修改此操作后,订阅列表仅包含AlertPrefContactTypeEnum。PRIMARY和AlertPrefContactTypeEnum。次要对象。我的意思是列表的大小保持不变,但值发生了变化。
这是因为您违反了映射(函数)的约定
参数:映射器-应用于每个元素的无干扰、无状态函数
你违反了“无国籍”部分:
无状态行为
如果流操作的行为参数是有状态的,则流管道结果可能不确定或不正确。有状态lambda(或实现适当功能接口的其他对象)的结果取决于流管道执行期间可能更改的任何状态。有状态lambda的一个示例是中的参数
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
在这里,如果并行执行映射操作,则由于线程调度的差异,相同输入的结果可能因运行而异,而对于无状态lambda表达式,结果总是相同的。
还要注意的是,试图从行为参数访问可变状态,在安全性和性能方面给您带来了一个错误的选择;如果不同步对该状态的访问,则存在数据竞争,因此代码被破坏,但如果同步对该状态的访问,则存在争用风险,从而破坏了您希望从中受益的并行性。最好的方法是完全避免流操作的有状态行为参数;通常有一种方法可以重构流管道以避免状态性。
实现该映射操作的正确方法是复制alertPrefSubscriptionsBO
并为副本提供新类型。
遵循java使用的样式。时间类,例如用xxx(…)查看所有的 ZonedDateTime的方法,您可以将alertPrefSubscriptionsBO对象设置为不可变的,或者将其视为不可变的,并且具有用于获取属性已更改的副本的方法,例如使用类型为(…)的方法
.map(bo -> bo.withType(bo.getType() == PRIMARY_CONTACT ? PRIMARY : SECONDARY))
我已经设置了Spring Cloud Stream中提供的Spring Avro模式注册表,以便在RabbitMQ中使用。我看到的大多数示例都使用Maven Avro插件从模式资源文件生成Java类。然后在架构注册表中注册架构文件。我的理解是,此注册表允许消息仅通过对已注册架构的引用进行SERDE,而不是在消息中包含整个架构。我不明白的是,在设计时,这些模式文件是如何在所有服务之间分发的,以生成J
对于使用kafka的Spark流,我们使用Directstream,这是一种无接收器的方法,并将kafka分区映射到Spark RDD分区。目前,我们有一个应用程序,其中我们使用Kafka直接方法并在RDBMS中维护我们的on偏移, 我们有类似的Kinesis吗?当我阅读火花-Kinesis集成的留档时,感觉检查点有所不同。以下是我遇到的一些问题 使用kinesis流是否将kinesis碎片映射到
本文向大家介绍Postgresql数据库之创建和修改序列的操作,包括了Postgresql数据库之创建和修改序列的操作的使用技巧和注意事项,需要的朋友参考一下 创建序列 (从1开始,递增幅度1,最大值无上限): 更改序列值 (方法中两个参数分别是1.序列名字,2.序列修改后值): Navicat Premium中序列位置如下图: 补充:PostgreSQL 序列增删改 创建序列 指定序列(给表的主
本文向大家介绍postgresql 修改字段长度的操作,包括了postgresql 修改字段长度的操作的使用技巧和注意事项,需要的朋友参考一下 使用数据库postgresql的时候,有时会遇到字段长度扩展的情况,由于之前已经有数据了,所以只能修改字段长度,不能通过删除再增加的方式。 可以使用如下方式进行 通过上面的一句话就可以把你的表中相应的字段的长度修改为3000. 补充:PostgreSQL字
问题内容: 我知道,我们不能使用来重命名列,但是可以。 我的问题是:的主要用途是什么? 例如, 代替 已编辑的 问题已替换 的主要用途是什么? 上面的问题被下面的问题取代 为什么我们必须使用更改列而不是修改列? 问题答案: CHANGE COLUMN如果您已经创建了MySQL数据库,并确定其中一个列的名称不正确,则无需删除它并进行替换,您只需使用 change column 重命名即可。 MODI
这可能吗?。。OsCommerce需要这些设置, 全局寄存器-- 但不幸的是,我不允许编辑php。ini文件,因为共享主机。。还有别的办法吗?我只有FTP访问权限。 编辑: PHP版本5.2。17 服务器API CGI/FastCGI