java-stream - 我能说java.util.stream.Stream中的peek()方法应该是幂等的吗
问题描述
我的问题与:幂等方法是什么意思以及在调用 java.lang.AutoCloseable 的 close 方法的情况下有什么副作用?
至于中的方法java.util.stream.Stream.peek()
,在Oracle Certified Professional Java SE 8 Study Guide > Chapter 4 Functional Programming > Using Streams > Using Common Intermediate Operations 一书中,指出peek() 旨在执行操作而不改变结果
我的问题是:我可以说在实践中,即使有状态代码可以编译,peek(Consumer action) 中的操作也应该是幂等的?peek()
解决方案
你不应该因为这意味着操作可以改变最终结果,因为幂等操作可以改变它操作的对象。
以下示例在peek()
方法内部使用幂等操作但会更改结果(根据您指出的文档,这不是一个好习惯)
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class SomeClass {
private String state = "some-value";
public void idempotent() {
state = "other-value";
}
@Override
public String toString() {
return "SomeClass{" +
"state='" + state + '\'' +
'}';
}
}
public class Idempotent {
public static void main(String[] args) {
Set<SomeClass> collect = Stream.of(new SomeClass(), new SomeClass())
.peek(SomeClass::idempotent)
.collect(Collectors.toSet());
System.out.println(collect);
}
}
在peek()
操作之前,流由 组成,["some-value", "some-value]
在peek()
具有幂等操作之后,它由 组成["other-value", "other-value"]
。
推荐阅读
- websocket - Ratchet 连接接口是否具有除 resourceId 之外的其他属性?
- javascript - Onclick 显示 div 重叠/隐藏其他
- computer-vision - 计算机视觉中的 3D 重建中的术语在线和离线指的是什么?
- javascript - 从 Facebook 帖子上的 Chrome 扩展触发 React 组件的状态更改
- javascript - React 保存动态 UI 组件
- reactjs - Gatsby + React 预订日历:“WebpackError: ReferenceError: self is not defined” on 'gatsby build' 但 'gatsby develop' 工作正常
- java - 使用包含带有 RestTemplate 的数组的单个字段为 json 创建 POJO
- firebase - Firebase 安全规则:“规则集使用旧版本”,当前版本是什么?
- postgresql - PostgreSQL - 将字符串转换为 ASCII 整数
- git - 从 Develop 分支到 Master 分支的 Github Pull Request 显示以前的提交。如何避免此类问题?