Bir for döngüsü değil, lambda ifadeleri kullanarak bir sayı listesi oluşturmak istiyorum.Java'da Lambda ifadeleri 8
Yani ben formülü takip numaraları 100. Üçgen sayılar altındaki tüm üçgen numaralarının bir listesini oluşturmak istediğiniz diyelim: (n * n + n)/2
Bunu yapmanın en iyi yolu nedir ? Şu anda bu var:
Stream.iterate(1, n -> n + 1).limit(100)
.map(n -> (n * n + n)/2)
.filter(a -> a < 100)
.map(a -> a + "")
.collect(Collectors.joining(", ", "Numbers: ", "."));
Ama bu hesaplamaların miktarı ile gereksiz yere overkill gibi görünüyor. N'yi 1'den 100'e kadar yineliyorum (çünkü n'nin maksimum değerinin ne olduğunu bilmediğimi varsayalım), o zaman bu listenin üçgen sayı fonksiyonunu haritayorum ve sonra 100'ün altında olan sayıları kontrol ediyorum. Daha verimli bir yol var mı Bunu yaparken? Ayrıca: Yineleme, sınırlama ve ardından harita kullanmak yerine Aktarımın yalnızca yineleme işlevini kullanarak üçgen sayılarını oluşturabilir miyim?
DÜZENLEME: Demek ki ana nokta şudur: Üçgen sayılarından biri 100'ü aştığı anda traingle sayılarının hesaplanması nasıl durur? Genellikle bu gibi yazmak istiyorum:
çok verimli olan en kısa sürede bir üçgen sayısı 100 aşıyor olarak dururArrayList<Integer> triangles = new ArrayList<>();
for (int n=1;true;n++) {
int num = (n*n+n)/2;
if (num>100) break;
triangles.add(num);
}
; lambda ifadesinde bu etkinliği nasıl koruyabilirim?
Stream.iterate (1, n-> n + 1) .limit (100) 'muhtemelen daha okunaklı olan IntStream.rangeClosed (1, 100) olarak yeniden yazılabilir. – Pshemo
neden hem limit hem de filtre kullanıyorsunuz?İkinci filtrenin çıktıyı hesaplamaya göre sınırlayacağına inanıyorum, bu yüzden 100'den daha az olan girdiler yerine 100'den daha az olan sonuçlar elde edersiniz. –
Konu nedir? Yoksa sadece merak mı? – doublep