作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
我已经使用 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 的建议。
所以,这是一个kluge。我正在与 luigi 和 sciluigi 一起工作。 isinstance 检查在 sciluigi 包中,我宁愿 kluge 它然后必须为这个小问题分支整个 scilui
我是一名优秀的程序员,十分优秀!