SORU
25 ŞUBAT 2015, ÇARŞAMBA


Java8 akarsu sıralı ve paralel yürütme farklı sonuçlar?

Java8 aşağıdaki akış örnek çalışma:

    System.out.println(Stream
        .of("a", "b", "c", "d", "e", "f")
        .reduce("", (s1, s2) -> s1   "/"   s2)
    );

verim:

/a/b/c/d/e/f

- Elbette - hiçbir sürpriz. http://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html nedeniyle akışı sırayla veya paralel yürütülen olup olmadığı önemli olmamalı:

Hesaplama sonucu değiştirmemelidir paralel bir akış sırayla yürütür ya. işlemleri açıkça belirli olmayan olarak tanımlanan, findAny gibi hariç),

AFAIK reduce() deterministik ve (s1, s2) -> s1 "/" s2 parallel() ekleyerek aynı sonucu verecektir böylece ilişkilendirilebilir.:

    System.out.println(Stream
            .of("a", "b", "c", "d", "e", "f")
            .parallel()
            .reduce("", (s1, s2) -> s1   "/"   s2)
    );

Ancak benim makinede sonucudur:

/a//b//c//d//e//f

Burada yanlış olan ne?

BTW: kullanarak (tercih edilen) .collect(Collectors.joining("/")) reduce(...) verimleri yerine, aynı sonucu sıralı ve paralel yürütme için a/b/c/d/e/f.

JVM ayrıntılar:

java.specification.version: 1.8
java.version: 1.8.0_31
java.vm.version: 25.31-b07
java.runtime.version: 1.8.0_31-b13

CEVAP
25 ŞUBAT 2015, ÇARŞAMBA


Azaltmak gelen belgeleri:

Kimlik değeri akümülatör fonksiyon için bir kimlik gerekir. Bu t için, akümülatör anlamına gelir.geçerli(kimlik) t t eşittir.

Hangi durumda doğru değil - "" ve "" bir"/". oluşturur

Akü işlevi sürükleyin ve bir çıktının ne olacağını göstermek için eklendi

BinaryOperator<String> accumulator = (s1, s2) -> {
    System.out.println("joining \""   s1   "\" and \""   s2   "\"");
    return s1   "/"   s2;
};
System.out.println(Stream
                .of("a", "b", "c", "d", "e", "f")
                .parallel()
                .reduce("", accumulator)
);

Bu örnek çıktı (çalışan arasında farklıdır):

joining "" and "d"
joining "" and "f"
joining "" and "b"
joining "" and "a"
joining "" and "c"
joining "" and "e"
joining "/b" and "/c"
joining "/e" and "/f"
joining "/a" and "/b//c"
joining "/d" and "/e//f"
joining "/a//b//c" and "/d//e//f"
/a//b//c//d//e//f

İşlev için if ifadesi boş bir dize ayrı: işlemek için ekleyebilirsiniz

System.out.println(Stream
        .of("a", "b", "c", "d", "e", "f")
        .parallel()
        .reduce((s1, s2) -> s1.isEmpty()? s2 : s1   "/"   s2)
);

Marko Topolnik fark olarak, s2 akü olarak gerekli değildir kontrol değişmeli işlevi olmak zorunda değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dopelives

    Dopelives

    30 Temmuz 2009
  • Dylan Brenan

    Dylan Brenan

    22 Aralık 2009
  • Kai Moosmann

    Kai Moosmann

    5 Temmuz 2006