gpt4 book ai didi

Java Stream 关​​闭方法的不明确行为

转载 作者:行者123 更新时间:2023-11-29 08:27:57 25 4
gpt4 key购买 nike

给定这个 Java 类:

class MyClass {
private int value;

public MyClass(int value) {
this.value = value;
}

public void setValue(int value) {
this.value = value;
}

public int getValue() {
return this.value;
}

@Override
public String toString() {
return "Value: " + value;
}
}

给出这段 Java 代码:

Consumer<MyClass> cons = mc -> mc.setValue(mc.getValue() * mc.getValue());

List<MyClass> list = new ArrayList<>();
list.add(new MyClass(1));
list.add(new MyClass(2));
list.add(new MyClass(3));

System.out.println(list);

我得到了这个输出:[值:1,值:2,值:3]

当我运行这段代码时:

list.stream().peek(cons).close();   //1
System.out.println(list);

我期望输出 [Value: 1, Value: 4, Value: 9],但我得到的是 [Value: 1, Value: 2, Value: 3],所以列表中的元素没有被修改。

但是当我运行这个时:

list.stream().forEach(cons);        //2

还有这个:

list.stream().peek(cons).count();   //3

我两次都得到了预期的输出 ([Value: 1, Value: 4, Value: 9])

为什么行//1 没有给我这个输出?我想那是因为 close():这个方法是如何工作的?

感谢您的支持。

最佳答案

close,无论是否有终端操作都会触发;如果它用于 try with resourceclose 则在流本身上调用;但无论哪种方式,它都不是终端操作。所以它既不是 intermediate 也不是 terminal - 它有点特别。

    Stream<Integer> s2 = Stream.of(1, 2, 3);
s2.onClose(() -> System.out.println("Closing 2"));
s2.close(); // will print Closing 2

但也看到了这个:

    try (Stream<Integer> s = Stream.of(1, 2, 3)) {
s.onClose(() -> System.out.println("Closing"));
s.filter(x -> x > 1)
.peek(x -> System.out.println("foud one"));
}

运行此程序并亲自查看在第二个示例中 peek 未被触发,但 close 被触发。

因此,为了回答您的问题,正确的措辞是:close 不是终端操作,因此不会执行您的流管道。

关于Java Stream 关​​闭方法的不明确行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50874268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com