gpt4 book ai didi

java - 如何在 Java 8 中创建漂亮的迭代

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

灵感来自 Adam Bien's weblog我想将 Java 7 中的常见迭代替换为 Java 8 中更好的迭代。旧代码如下所示:

void repeatUsingJava7(int times) {
for (int i = 0; i < times; i++) {
doStuff();
doMoreStuff();
doEvenMoreStuff();
}
}

...这不太好。所以我使用 Adam Bein 的示例将其替换为:

void repeatUsingJava8(int times) {
IntStream.range(0, times).forEach(
i -> {
doStuff();
doMoreStuff();
doEvenMoreStuff();
}
);
}

...这是朝着正确方向迈出的一步,但并没有使代码更易于阅读,而且还引入了一个不需要的变量 i,以及一对额外的大括号.所以现在我想知道是否有其他方法可以编写这段代码,使其更好、更易于阅读,主要是使用 Java 8。

最佳答案

为了完整起见,这里有一个不需要计数器变量的解决方案:

void repeatUsingJava8(int times) {
Collections.<Runnable>nCopies(times, ()->{
doStuff();
doMoreStuff();
doEvenMoreStuff();
}).forEach(Runnable::run);
}

如果只有一个方法被多次调用,它会变得更具可读性,因为在这种情况下它可以写成,例如

void repeatUsingJava8(int times) {
Collections.<Runnable>nCopies(times, this::doStuff).forEach(Runnable::run);
}

如果一定要是Stream,上面的代码等同于

void repeatUsingJava8(int times) {
Stream.<Runnable>generate(()->this::doStuff).limit(times).forEach(Runnable::run);
}

但是,这些替代方案并不比旧的 for 循环更好。如果您考虑并行执行,这是Stream相对于普通for循环的真正优势,仍然有基于众所周知的、已批准的替代方案API:

ExecutorService es=Executors.newCachedThreadPool();
es.invokeAll(Collections.nCopies(times, Executors.callable(()->{
doStuff();
doMoreStuff();
doEvenMoreStuff();
})));

关于java - 如何在 Java 8 中创建漂亮的迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27779568/

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