gpt4 book ai didi

lambda - Java 8 流和 lambda 是在骗人吗?

转载 作者:行者123 更新时间:2023-12-03 19:34:00 24 4
gpt4 key购买 nike

<分区>

我已经使用 Java 8 的 lambda 和流有一段时间了,因为我的硕士学位项目和我注意到一些在互联网上没有被广泛讨论的事情。我正在使用 Netbeans 进行开发,它多次建议改变“老式”风格以支持这两个新的构造函数。但我想知道这些建议是否真的有用。重点是:

  • 易读性

也许是习惯问题,但如果您使用嵌套的 lambda,理解正在发生的事情可能会变成一场噩梦。

  • 可测试性

由于 Netbeans 的建议,我们倾向于将 for 循环更改为流的 foreach 调用,但是在可测试性方面存在微妙但非常危险的副作用。如果您的代码在 foreach block 内失败,IDE(实际上是编译器)根本不知道错误发生在哪一行,指向 block 的开头。此外,调试代码更加困难,因为我们无法控制计算和内部循环。

  • 表现

同样,IDE 总是建议将 accumulation 更改为一种 map reduce 算法。后者看起来更复杂,所以我创建了一个简单的测试来检查这种方法有多好。令人惊讶的是,它多了!

这是代码:

public class Java8Kata {

public static void main(String[] args) {

System.out.println("Generating random numbers...");
final Collection<Number> numbers = getRandomNumbers();

System.out.println("Starting comparison...");

for (int i = 0; i < 20; i++) {
getTotalConventionalStyle(numbers);
getTotalNewStyle(numbers);
}
}

public static void getTotalConventionalStyle(Collection<Number> numbers) {

long startTime = System.nanoTime();
System.out.println("\n\nstarting conventional...");
double total = 0;
for (Number number : numbers) {
total += number.doubleValue();
}
System.out.println("total = " + total);

System.out.println("finish conventional:" + getPeriod(startTime) + " seconds");
}

public static void getTotalNewStyle(Collection<Number> numbers) {

long startTime = System.nanoTime();
System.out.println("\n\nstarting new style ...");

double total = 0;
//netbeans conversion
total = numbers.parallelStream().map((number) -> number.doubleValue()).reduce(total, (accumulator, _item) -> accumulator + _item);
System.out.println("total = " + total);

System.out.println("finish new style:" + getPeriod(startTime) + " seconds");
}

public static Collection<Number> getRandomNumbers() {

Collection<Number> numbers = new ArrayList<>();

for (long i = 0; i < 9999999; i++) {
double randomInt = 9999999.0 * Math.random();
numbers.add(randomInt);
}
return numbers;
}

public static String getPeriod(long startTime) {
long time = System.nanoTime() - startTime;
final double seconds = ((double) time / 1000000000);
return new DecimalFormat("#.##########").format(seconds);
}

为了确保结果一致,我已经进行了 20 次比较。

他们在这里:

Generating random numbers...Starting comparison...starting conventional...total = 5.000187629072326E13finish conventional:0.309586459 secondsstarting new style ...total = 5.000187629073409E13finish new style:20.862798586 secondsstarting conventional...total = 5.000187629072326E13finish conventional:0.316218488 secondsstarting new style ...total = 5.000187629073409E13finish new style:20.594838025 seconds[...]

我的目标不是进行深度性能测试,我只是想看看 Netbeans 是否对我有帮助。

作为结论,我可以说您应该谨慎使用这些新结构,由您自己决定,而不是遵循 IDE 的建议。

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