gpt4 book ai didi

java - 如何将流与干扰方法和构造函数一起使用,为什么不使用 .peek()?

转载 作者:搜寻专家 更新时间:2023-11-01 02:58:28 24 4
gpt4 key购买 nike

我将展示我的问题的一个简化示例以帮助演示它。

假设我正在尝试将旧的 java 代码转换为 java 8 代码以用于样式和并行化目的(我这样做)。

这是代码:

    public static boolean deleteTester(List<Integer> keys) {
DHeap dHeap = new DHeap(d, keys.size());
DHeap_Item[] DHeap_ItemArray = keysListToDHeap_ItemArray(keys);
dHeap.arrayToHeap(DHeap_ItemArray);

for (int i = 0; i < keys.size(); i++) {
keys.set(i, null);
dHeap.delete(DHeap_ItemArray[i]);
if (!someTest(keys, dHeap.getList()))
return false;
}
return true;
}

转换中有几个问题:

  1. 我需要检查每个迭代,所以我不能减少/收集然后检查。
  2. 我正在访问一个数组和一个数据结构对象(测试器针对的对象),这意味着它不是无干扰的,也不是无状态操作。

这是我尝试替换 for 循环的尝试:

    return IntStream.range(0, keys.size())
//.parallel()
.peek(idx -> keys.set(idx, null))
.peek(idx -> dHeap.delete(DHeap_ItemArray[idx]))
.allMatch(e -> someTest(keys, dHeap.getList()));

它更短且更易读,但是“打破了规则”,结果无法并行。

所以我的问题是:

  1. 为什么我无法使用 .parallal()? (我得到一个空指针 ex.)
  2. 为什么我们不应该使用 peek()?因为在这段代码中我看不到其他解决方法。
  3. 访问外部元素时应该怎么做?
  4. 我应该如何将代码“传输”到 java 8 流?
  5. 我错过了什么?

我想答案是交织在一起的。我刚开始学习 Java 8,非常感谢所有帮助,因为我真的被困住了。

最佳答案

Q: Why am I unable to use .parallal()?

Q: What should I do when accessing outside elements?

您可以在并行流中使用它,当操作不修改那里的共享状态时没有问题,例如:

stream.peek(System.out::println).allMatch(...);

如果操作修改共享状态,它负责提供所需的同步,例如:

stream.peek(it->{synchronized(lock){ keys.set(idx, null); }}).allMatch(...);

Q: Why shouldn't we use peek()?

你可以使用peek()方法,但是如果你不能控制流,你应该避免使用peek(),例如:

boolean foo(){ stream.peek(...).allMatch(..); }

//a violate rule
Stream<?> foo(){
/*you need avoiding using peek() here since you can't control the stream*/
}

Q: How should I "transfer" the code to java 8 streams?

在其包摘要中有详细描述如何操作流java.util.stream .

关于java - 如何将流与干扰方法和构造函数一起使用,为什么不使用 .peek()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44750795/

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