Yeni Java 8 akış yeteneklerini yeni keşfettim. Python'dan geldiğimde, iki diziyi "tek satırlı bir pitonik" şekilde çarparak, toplama gibi diziler üzerinde işlemler yapmanın düzgün bir yolu olup olmadığını merak ediyordum.
Teşekkürler
Yeni Java 8 akış yeteneklerini yeni keşfettim. Python'dan geldiğimde, iki diziyi "tek satırlı bir pitonik" şekilde çarparak, toplama gibi diziler üzerinde işlemler yapmanın düzgün bir yolu olup olmadığını merak ediyordum.
Teşekkürler
Yanıtlar:
java.util.Arrays
Bir diziyi Java 8 akışına dönüştürmek için eklenen ve daha sonra toplama vb. İçin kullanılabilecek yeni yöntemler vardır .
int sum = Arrays.stream(myIntArray)
.sum();
İki diziyi çoğaltmak biraz daha zordur çünkü bir AND işlemi ile aynı anda değer VE indeksi elde etmenin bir yolunu düşünemiyorum. Bu, muhtemelen dizinin dizinleri üzerinden akış yapmanız gerektiği anlamına gelir.
//in this example a[] and b[] are same length
int[] a = ...
int[] b = ...
int[] result = new int[a.length];
IntStream.range(0, a.length)
.forEach(i -> result[i] = a[i] * b[i]);
DÜZENLE
Commenter @Holger , map
bunun yerine yöntemi kullanabileceğinizi belirtiyorforEach
:
int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();
mapToInt
boks önlemek için kullanmak istiyorum .
Bir diziyi aşağıdakileri kullanarak akışa dönüştürebilirsiniz Arrays.stream()
:
int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);
Eğer akışı var sonra, açıklanan yöntemlerden herhangi birini kullanabilirsiniz belgeleri gibi sum()
ya da her neyse. Şunları yapabilirsiniz map
veya filter
Python gibi Lambda fonksiyonu ile ilgili akışı yöntemlerini çağırarak:
Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);
Akışınızı değiştirdikten sonra, toArray()
başka bir yerde kullanmak için tekrar bir diziye dönüştürmek için çağrı yaparsınız :
int[] ns = new int[] {1,2,3,4,5};
int[] ms = Arrays.stream(ns).map(n -> n * 2).filter(n -> n % 4 == 0).toArray();
Büyük sayılarla uğraşmak zorundaysanız dikkatli olun.
int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0
Yukarıdaki toplam değildir 2 * Integer.MIN_VALUE
. Bu durumda bunu yapmanız gerekir.
long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct
Arrays.stream (arr) öğesinin Stream yerine bir LongStream (veya IntStream, ...) oluşturduğunu ve böylece harita işlevinin türü değiştirmek için kullanılamayacağını unutmayın. Bu nedenle .mapToLong, mapToObject, ... işlevleri sağlanmıştır.
Bir diziden neden akış gerçekleştirirken neden-cant-i-map-integer'lardan dizelere bir göz atın
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();