gpt4 book ai didi

Java 8 中断 forEach 与替代操作

转载 作者:行者123 更新时间:2023-12-01 10:22:03 25 4
gpt4 key购买 nike

我确实有以下类(class):

public class CloseableRepeater<R extends Closeable> {

/**
* Repeats the supplier until the stop condition becomes <code>true</code>.
*
* @param supplier The supplier to be repeated.
* @param until The stop condition.
* @param times The maximum repeat times.
* @return The result.
*/
public Optional<R> repeat(Supplier<R> supplier, Predicate<R> until, int times) {
R r = null;
for (int i = 0; i < times; i++) {
r = supplier.get();
if (until.test(r)) {
break;
} else {
try {
r.close();
} catch (IOException e) {
// Ignore
}
}
}
return Optional.of(r);
}

}

基本上,它重复一个 Action ,直到满足一个条件并关闭不满足它的项目。

我的问题

有没有可能重写方法 repeat使用函数式编程?

我知道代码已经足够好了,但是这个问题的目标是提高我的函数式编程技能并找到它的局限性

我得到的最接近的是:
public Optional<R> repeat(Supplier<R> supplier, Predicate<R> until, int times) {
return IntStream.range(0, times).mapToObj(i -> supplier.get()).filter(until).findFirst();
}

但是 close部分丢失。

最佳答案

在@VinceEmigh 的评论之后,我想我找到了解决方案:

   public Optional<R> functionalRepeat(Supplier<R> supplier, Predicate<R> until, int times) {
return Stream.generate(supplier).limit(times).filter(until.or(t -> {
try {
t.close();
} catch (IOException e) {
// Ignore
}
return false;
})).findFirst();
}

这个想法是调用 close同时通过链接 until 进行过滤谓词与另一个执行关闭的谓词,使用它涉及短路逻辑或这一事实。

过滤条件为真,当且仅当 until谓词为真,因此它们在逻辑上是等价的。

更新

其实上面的代码是 不是 等同于原始代码,因为它在不匹配时产生一个空的可选项,而原始代码产生一个包含最后一个不匹配元素的可选项。

关于Java 8 中断 forEach 与替代操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59764514/

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