我只是在尝试使用Java 8,通过编写一个程序来计算大型列表中偶数的总和,并与Java 6进行比较。
Java 8
public class ListOperationsJava8 {
static List<BigInteger> list = new LinkedList<>();
public static void main(String[] args) {
createList();
long start = System.currentTimeMillis();
/*System.out.println(list.parallelStream().
filter(n -> n.mod(new BigInteger("2")).equals(BigInteger.ZERO)).
mapToInt(BigInteger::intValue).sum()); --> gives result -1795017296 */
System.out.println(list.parallelStream().
filter(n -> n.mod(new BigInteger("2")).equals(BigInteger.ZERO)).
mapToLong(BigInteger::longValue).sum());
long end = System.currentTimeMillis();
System.out.println("Time taken using Java 8: " + (end - start) + " ms");
}
private static void createList() {
for (int i = 0; i < 100000; i++) {
list.add(new BigInteger(String.valueOf(i)));
}
}
}
Java 6
public class ListOperationsClassic {
static List<BigInteger> list = new LinkedList<BigInteger>();
public static void main(String[] args) {
createList();
long start = System.currentTimeMillis();
BigInteger sum = BigInteger.ZERO;
for(BigInteger n : list) {
if(n.mod(new BigInteger("2")).equals(BigInteger.ZERO))
sum = sum.add(n);
}
System.out.println(sum);
long end = System.currentTimeMillis();
System.out.println("Time taken using Java 6: " + (end - start) + " ms");
}
private static void createList() {
for (int i = 0; i < 100000; i++) {
list.add(new BigInteger(String.valueOf(i)));
}
}
}
我有两个问题
- 在Java 8代码中,我最初使用了
mapToInt(BigInteger::intValue).sum())
来减少值,但是得到了负数结果-1795017296
!为什么?我理解期望的结果2499950000
本身在int
可以表示的范围内。 - 我运行了几次代码,我总是发现Java 8的代码比使用Java 6的代码要慢多达5倍。这可能意味着什么?对于这种规模的操作,并没有必要使用
parallelStream
和/或reduce
操作,普通的for循环更好吗?
这是其中一个结果:
2499950000
Time taken using Java 6: 52 ms
2499950000
Time taken using Java 8: 249 ms
System.out.println(list.parallelStream()...
的情况下运行它。这会大大增加您的执行时间。 - BucketThread.sleep(100)
,则统计信息将恢复为原始状态。 - Joop EggenSystem.out.println
,所以它不可能有影响。对于 lambda 表达式也没有影响,因为打印肯定是最后执行的事情。 - skiwi2^31-1
,而不是2^32-1
。 - Alexis C.