2015-09-18 12 views
7

を使用して、リストのないヌル要素が続か取得:私が書きたい私はリストの最後のnullでない要素を取得したい場合、私はこのような何か書き、Javaの7でJava 8

public CustomObject getLastObject(List<CustomObject> list) { 
    for (int index = list.size() - 1; index > 0; index--) { 
     if (list.get(index) != null) { 
      return list.get(index); 
     } 
    } 
    // handling of case when all elements are null 
    // or list is empty 
    ... 
} 

をラムダまたは私が最初ではないヌルの要素を取得したい場合たとえば、私はこれを書くことができるの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(); 
} 

はたぶん誰かがこの問題を解決する方法を知っていますか?ストリームは必ずしも発注されていないため、ストリームAPIにはfindLast方法がないこと

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(); 
} 

注:

+0

ラムダを使用することは常に**良いアイデアではありません。 @ Tunakiの答えが与えられれば、それは非ラムダの方法を使って読者にはっきりと分かります。 – lschuetze

+1

関連:[Java 8で逆順でリストから順序付けされたストリームを取得する方法](http://stackoverflow.com/q/29403614/2711488)および["ストリームの最後の要素を取得する最も効率的な方法"](http://stackoverflow.com/q/27547519/2711488) – Holger

+0

@lschuetze、私はラムダの可能性を学ぶだけで、私はどのように新しい機能を使って簡単な問題を決めることができるか知りたいです – ZhenyaM

答えて

10

可能な解決策は、逆の順序でリストを反復処理し、最初の非ヌル要素を維持するだろう有限である。

もう1つの解決策は、リストを反復して、現在の要素のみを保持することによってリストを反復することです。これにより、Streamを最後の要素まで効果的に減らします。

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

ありがとう、これは間違いありません。 – ZhenyaM

+2

@assylias ['Collection.stream()'](https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#stream--)によって返されるストリームはシーケンシャルですJavadocごとに) – Tunaki

+1

これは私が他の質問にリンクしていることを示しています。最後の要素を取得するために 'reduce'を使用することは確立された解決策です(http://stackoverflow.com/a/27547525/2711488)。並列実行でも動作します。リダクション関数は連想的でなければならないが、可換性である必要はない。 – Holger

関連する問題