2016-03-23 19 views
0

Basit sözdizimi olduğunu kullanan numaralar yineleyebilirsiniz verilen aralıktan ardışık sayılar tekrarlatacak? Şimdi akışları keşfetmek ediyorum ve böyle bir fikir geldi:En kısa özlü okunabilir sözdizimi <code>groovy</code> yılında

IntStream.range(0, 10) 
     .forEach(do_domething()); 

Hatta artık geleneksel şekilde (aşağıda) daha, ama daha özlü gibi görünüyor.

for (int i = 0; i < 10; i++) 
    do_domething() 

Bunu yapmanın daha kısa ve okunabilir bir yolu olup olmadığını merak ediyorum. Java ile ilgili her şeyi bilmiyorum, bu yüzden sadece soruyorum, muhtemelen böyle bir şey yok, ama emin olmak isterim. Başka pek bir şey yok,

import static java.util.stream.IntStream.range; 

Sonra sözdizimi Bunun ötesinde

range(0, 10).forEach(...) 

olur: Bir sınıfta tekrar tekrar IntStream.range kullanmanız gerekirse

+2

Ne oldu geleneksel yolla? –

+0

Sorunuz nedir? bana açık değil. – Braj

+0

Sorunun nereden geldiğini (int i ...) yazma * daha az * karakterlerin kodu daha hızlı çalışmamasını veya ... – FredMaggiowski

cevap

2

, statik içe kullanarak ayrıntı azaltabilir Önerebilirim. Benim görüşüme göre for(int i = 0; i < n; i++) tekrar tekrar yazmak zorunda olduğumuzdan biraz saçma, ama en azından anında tanınabilir olma avantajına sahip.

2

Bu ikisi arasında, birbirlerinin yerine koymalarını engellemeyen bazı büyük farklılıklar vardır.

Düzenli bir döngüden dönüş, yönteminizden dönecektir, ancak akış/lambda sürümü için, lambda işlevinden döndürür. Aşağıya bakınız.

for (int i = 0; i < 10; i++) { 
     if (i == 5) { 
      return;//returns from the whole method 
     } 
    } 

    IntStream.range(0, 10).forEach((i -> { 
     if (i == 5) { 
      return; //returns only from the lambda 
     } 
    })); 

Diğer önemli fark, iki kod bloğunun değişkenlerle nasıl etkileştiğidir. Lambdaların bizim dışımızdaki değişkenler ile etkileşime girebilmesi için nihai olmaları gerekir. Yani aşağıdaki akış/lambda kodu derlenmeyecek.

String x = ""; 

    for (int i = 0; i < 10; i++) { 
     if (i == 5) { 
      x = "5"; 
     } 
    } 

    IntStream.range(0, 10).forEach((i -> { 
     if (i == 5) { 
      x = "5"; //wont compile 
     } 
    })); 

Bu ikisi arasında başka farklılıklar da olabilir. Ama benim için bu sonuncusu, düzenli for-döngüsü kullanmaya devam etmemi sağlayan sorunlara neden oldu.

0

Sen Sonra bir foreach döngüsü yazmanız gereken tüm kullanarak bir diziyi

public static int[] range(final int length){ 
    return IntStream.range(0, length).toArray(); 
} 

oluşturmak için bir yardımcı işlevi oluşturabilir geçerli:

for(int i : range(10)) { 
    do_domething(); 
} 
0

Sen sözde "Facetious Ok kullanabilirsiniz "operatörü (bir ok gibi görünüyor" -> ") biraz daha kısa bir şekilde döngü yazmak için.Örneğin

for (int i=10;i-->0;)doSomething(); 

: [Profesyonel İpucu Gerçekten bir ok değil]:

for (int i=10;i-->0;)System.out.println(i); 

Baskılar:

9 
8 
7 
6 
5 
4 
3 
2 
1 
0 
1

size yardımcı yöntemini kullanabilirsiniz özlü istiyorum.

public static void each(int start, int end, IntConsumer consumer) { 
    IntStream.range(start, end).forEach(consumer); 
} 

ve "her" biraz ayrıntılı sen

public static void ⁀(int start, int end, IntConsumer consumer) { 
    IntStream.range(start, end).forEach(consumer); 
} 

public static void main(String... args) { 
    ⁀(0, 10, out::println); 
} 

baskılar gibi connector karakter kullanabilirsiniz ise o zaman

import static java.lang.System.out; 

each(0, 10, out::println); 

yazabilir

0 
1 
2 
3 
4 
5 
6 
7 
8 
9