我只是与Java 8玩弄和使用程序来计算的大名单琛使用Java 8
甚至数之和的Java 8与Java 6比较几件事整数列表
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
表示的范围内,如I 所理解的。 - 我跑了几次代码,我总是发现Java 8中的代码比使用Java 6的代码多5倍。Java代码 可能意味着什么?对于这种规模的操作,这是不值得使用
parallelStream
和/或reduce
操作和普通老式循环 是更好?
下面是结果之一:
2499950000
Time taken using Java 6: 52 ms
2499950000
Time taken using Java 8: 249 ms
_“总和值2499950000本身是可以通过我的理解一个int来表示的范围内。” _不,一个int的最大值是2147483647这是少一些。 –
尝试在没有调用System.out.println(list.parallelStream()...)的情况下运行它,这会增加执行时间。 – Bucket
并行流具有足够的开销,并且仅在更大的迭代次数(每个元素的持续时间),然后可以并行完成,如果你调用Thread.sleep(100),统计数据将会恢复 –