2015-03-03 42 views
6

azaltmak Ben rasgele sayılar üretmek için küçük bir program yazıyorum ve bunlar hakkında istatistiksel bilgi almak istedim. Bazı bilgiler çıktı almak için kullanmak istediğim bir List<AtomicInteger> var. Java 8 derleyici hata ve

Ben onun toplam liste (bütün AtomicIntegers değerleri örneğin toplamı) azaltmak için aşağıdaki kodu kullanarak çalıştı:

// not my real initialization code, just for illustration purposes 
List<AtomicInteger> values = new ArrayList<>(); 
for(int i = 0; i < 10; i++) { 
    values.add(new AtomicInteger()); 
} 

// this is the problematic reduce 
int total = values 
    .parallelStream() 
    .reduce(0, 
     (currentValue, currentAtomic) 
      -> currentValue + currentAtomic.get(), 
     (combiner1, combiner2) -> combiner1 + combiner2); 

Benim IDE (IntelliJ) hiç ama bu hat ile hiçbir sorunları var benim şimdiki javac sürümü (1.8.0_31) ile bu hat derleyicisi NullPointerException sonuçlanır:

An exception has occurred in the compiler (1.8.0_31). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you. 
java.lang.NullPointerException 
    at com.sun.tools.javac.code.Types.isConvertible(Types.java:290) 
    at com.sun.tools.javac.comp.Check.assertConvertible(Check.java:922) 
    at com.sun.tools.javac.comp.Check.checkMethod(Check.java:876) 
    at com.sun.tools.javac.comp.Attr.checkMethod(Attr.java:3838) 
    at com.sun.tools.javac.comp.Attr.checkIdInternal(Attr.java:3615) 
    at com.sun.tools.javac.comp.Attr.checkMethodIdInternal(Attr.java:3522) 
    at com.sun.tools.javac.comp.Attr.checkMethodId(Attr.java:3501) 
    at com.sun.tools.javac.comp.Attr.checkId(Attr.java:3488) 
    at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:3370) 
    at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1897) 
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607) 
    at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1843) 
    at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1465) 
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607) 
    at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:649) 
    at com.sun.tools.javac.comp.Attr.visitVarDef(Attr.java:1093) 
    at com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:852) 
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607) 
    at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676) 
    at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:692) 
    at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1142) 
    at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:909) 
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607) 
    at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676) 
    at com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:1035) 
    at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:778) 
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607) 
    at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676) 
    at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:4342) 
    at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4252) 
    at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4181) 
    at com.sun.tools.javac.comp.Attr.attrib(Attr.java:4156) 
    at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1248) 
    at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:901) 
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:860) 
    at com.sun.tools.javac.main.Main.compile(Main.java:523) 
    at com.sun.tools.javac.main.Main.compile(Main.java:381) 
    at com.sun.tools.javac.main.Main.compile(Main.java:370) 
    at com.sun.tools.javac.main.Main.compile(Main.java:361) 
    at com.sun.tools.javac.Main.compile(Main.java:56) 
    at com.sun.tools.javac.Main.main(Main.java:42) 

aynı azaltmak gerçekleştirmek için başka yollar muhtemelen olduğunu biliyoruz, ama gerçekten paralel saklamak istiyorsunuz dere doğası (sinc e orijinal kodumda çok fazla değer var). Derleyicimi çökertmeyecek ve aynı sonucu elde edebilecek başka bir paralel küçültme seçeneği önerebilir mi?

Bunun sadece karşılaştığım bir sorun olup olmadığını veya başkalarının bu derleyici hatasını yeniden üretip üretemeyeceğini bilmek isterim. derleyici çökmez

+0

javactır 1.8.0_31 ile Onaylandı. –

+4

Evet, javac 1.8.0_31'i de doğruladım, bir hata buldunuz ve rapor etmelisiniz. – shazin

+1

Yine de bir kopyası olabilir https://bugs.openjdk.java.net/browse/JDK-8068398 veya https://bugs.openjdk.java.net/browse/JDK-8046357 veya https: //bugs.openjdk .java.net/browse/JDK-8072751 – Marco13

cevap

3

Alternatif yerine reduce kullanmak yerine, mapToInt ve sum kullanabilirsiniz:

int total = values.stream().mapToInt(AtomicInteger::get).sum(); 
1

Versiyon:

// not my real initialization code, just for illustration purposes 
     List<AtomicInteger> values = new ArrayList<>(); 
     for(int i = 0; i < 10; i++) { 
      values.add(new AtomicInteger()); 
     } 

// this is the problematic reduce 
     BiFunction<Integer, AtomicInteger, Integer> accumulator = 
       (currentValue, currentAtomic) -> currentValue + currentAtomic.get(); 
     BinaryOperator<Integer> combiner = (combiner1, combiner2) -> combiner1 + combiner2; 
     int total = values 
       .parallelStream() 
       .reduce(0, accumulator, combiner); 
+2

Birleştirici kaldırabilir ve bir yöntem başvurusu kullanarak 'Integer.sum 'ile değiştirebilirsiniz:'. Yanlış (0, akümülatör, Tamsayı :: toplam); ' –

+0

Bazı nedenlerle bunu böldüğünüzde hiç Teşekkürler! -> CurrentValue + currentAtomic.get(), '.reduce (0, \t \t (Tamsayı CurrentValue, AtomicInteger currentAtomic) \t \t: – mhlz

+3

@mhlz Bölme dışarı sadece parametre türlerini belirtmek gerekir gerekli değildir \t \t Tamsayı :: toplam) 'da çalışır. –