首页 > 解决方案 > 我能说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()

标签: java-streamidempotentpeek

解决方案


你不应该因为这意味着操作可以改变最终结果,因为幂等操作可以改变它操作的对象

以下示例在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"]


推荐阅读