【发布时间】:2019-05-02 18:04:03
【问题描述】:
我在某处读到流操作总是在终端操作时返回一个新集合,并且不会更改已应用流操作的原始集合。
但在我的情况下,原始列表已被修改。
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.SECONDARY 对象。我的意思是列表的大小保持不变,但值发生了变化。
【问题讨论】:
-
是的。但是您不应该这样做,因为流 API 不是为此目的而设计的。但是,Java 没有一种语言机制来阻止你。
-
请注意,此代码不会修改原始集合:它仍然包含相同的对象。它修改了什么集合中包含的对象的状态,这不是一回事。
标签: java java-stream