2014-11-28 22 views
6

Zaten IntStream ve LongStream olduğunu biliyorum. Bir bayt dizisinden IntStream nasıl yapabilirim?Bayt dizisinden bir IntStream nasıl yapabilirim?

Şu an bunu yapmayı planlıyorum.

static int[] bytesToInts(final byte[] bytes) { 
    final int[] ints = new int[bytes.length]; 
    for (int i = 0; i < ints.length; i++) { 
     ints[i] = bytes[i] & 0xFF; 
    } 
    return ints; 
} 

static IntStream bytesToIntStream(final byte[] bytes) { 
    return IntStream.of(bytesToInt(bytes)); 
} 

Bunu yapmanın daha kolay mı yoksa daha hızlı yolu var mı?

+1

bir onaltılık dizesine bayt dizisi dönüştürme hakkında bir takip soru. http://stackoverflow.com/q/27181383/330457 –

cevap

7

Radiodef cevabı bir varyantı: (AtomicInteger kullanımı akışı paralel olarak çalıştırılmasına izin verir. Ama o kadar kötü değil):

static IntStream bytesToIntStream(byte[] bytes) { 
    return IntStream.range(0, bytes.length) 
     .map(i -> bytes[i] & 0xFF) 
    ; 
} 

paralelliğini garanti etmek kolay da.

1

Sen

static IntStream bytesToIntStream(byte[] bytes) { 
    AtomicInteger i = new AtomicInteger(); 
    return IntStream 
     .generate(() -> bytes[i.getAndIncrement()] & 0xFF) 
     .limit(bytes.length); 
} 

gibi bir şey yapabileceğini ancak çok hoş değil.

+1

Aslında, burada bir "AtomicInteger" kullanmak, "Stream" in kullandığınızı bilmediği için paralel işlemle ilgili herhangi bir yarar sağlamaz. Dolayısıyla, paralel yetenekler olmayacaktır. Her bir öğe yaratımının önceki durumun sonucuna bağlı olduğu bir 'Tedarikçi' için önemli değil… – Holger

+0

@Holger Akışta paralel() 'diyemez misiniz? Yoksa sadece bir ipucu mu? – Radiodef

+0

Akışta "parallel" olarak da adlandırılabilir ve paralel olarak işlemleri gerçekleştirmek en iyisidir, ancak "Tedarikçi" aynı anda sorgulanmayacak ve bir darboğaz haline gelecektir. Ancak eşzamanlı olarak adlandırılsa bile, 'AtomicInteger' tüm güncellemeleri serileştirdiği için bir darboğaz haline gelebilir. Eşzamanlı güncellemelere ihtiyaç duymayan kabul edilen yanıt için bu büyük bir fark. – Holger

1

Bir satır kodu:

import com.google.common.primitives.Bytes; 
IntStream in = Bytes.asList(bytes).stream().mapToInt(i-> i & 0xFF); 
İlgili konular