2015-09-18 28 views
7

kullanarak listenin değil boş eleman son Get lambdas ya da ben ilk değil boş eleman almak istiyorsanız Örneğin, ben bu yazabilir Java 8. başka özelliğini kullanarak kısa kod:Böyle bir şey yazmak, Java 7'de Java 8

public void someMethod(List<CustomObject> list) { 
    ..... 
    CustomObject object = getFirstObject(list).orElseGet(/*handle this case*/); 
    ..... 
} 

public Optional<CustomObject> getFirstObject(List<CustomObject> list) { 
    return list.stream().filter(object -> object != null).findFirst(); 
} 

Belki birisi bu sorunu çözmek için nasıl biliyor? Bir Akış mutlaka sipariş çünkü Akış API hiçbir findLast yöntem olduğunu

public Optional<CustomObject> getLastObject(List<CustomObject> list) { 
    return IntStream.range(0, list.size()).mapToObj(i -> list.get(list.size() - i - 1)) 
              .filter(Objects::nonNull) 
              .findFirst(); 
} 

Not:

+0

Lambdalar kullanmak her zaman ** iyi bir fikir değildir. @Tunaki'nin cevabı göz önüne alındığında, okuyucunun lambda olmayan bir şekilde kullanılması daha nettir. – lschuetze

+1

İlgili: [“Java 8'de ters sırayla bir listeden sıralı akış nasıl alınır”] (http://stackoverflow.com/q/29403614/2711488) ve [“Bir akışın son öğesini elde etmenin en etkili yolu ”] (Http://stackoverflow.com/q/27547519/2711488) – Holger

+0

@lschuetze, Sadece lambdaların olasılıklarını öğreniyorum ve yeni özellikleri kullanarak basit problemlere nasıl karar verebilirim bilmek istiyorum – ZhenyaM

cevap

10

Muhtemel bir çözüm ters sırada Listesi'nde üzerinde yineleme ve olmayan ilk boş elemanını tutmak olacaktır veya sonlu. Başka bir çözüm, listenin üzerinde yinelemek ve sadece mevcut öğeyi koruyarak azaltmaktır. Bu, Akışı son öğeye etkili bir şekilde azaltır.

public Optional<CustomObject> getLastObject(List<CustomObject> list) { 
    return list.stream().filter(Objects::nonNull).reduce((a, b) -> b); 
} 
+0

Çok teşekkür ederim, bu doğru. – ZhenyaM

+2

@assylias ['Collection.stream()'] tarafından döndürülen akış (https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#stream--) sıralıdır (Javadoc başına) – Tunaki

+1

Bu yüzden, diğer sorulara bağlı olduğumu, örneğin Son unsuru elde etmek için 'azaltmak'ı kullanmak [kurulmuş bir çözümdür] (http://stackoverflow.com/a/27547525/2711488). Paralel yürütmede bile çalışır. Azaltma işlevi ilişkisel olmalı, ancak değişmez olması gerekmiyor. – Holger