2017-06-23 1 views
2

オブジェクトのリストobjListには、2つのフィールドageidがあります。 agelongであり、idStringである。私はリストを反復して、リスト内の最小年齢を持つオブジェクトのIDを取得したい。私は、伝統的なforループでそれを行うことができますが、私はobjList.stream()を行い、その後、そのストリーム上のマップ機能を確認した場合、私はちょうどmapToIntmapToLong、およびmapToDoubleを持ってJavaで8Java 8は、オブジェクトのリストから別のフィールドが最小である場合にオブジェクトのフィールドを取得します。

コンパクトなソリューションが存在することになると確信しています。これらで私は最小年齢を取得しますが、私は最小年齢のオブジェクトのIDが必要です。

リストが空ではなく、少なくとも1つのオブジェクトを持つことが保証されています。あなたの仮定が無効である、とobjListがある場合

String id = objList.stream() 
    .min(Comparator.comparingLong(MyObject::getAge)) 
    .map(MyObject::getId) 
    .orElseThrow(IllegalArgumentException::new); 

:リスト内の要素を想定し

+0

リストが空の場合はどうなりますか? – shmosel

+0

私の場合、リストが空ではないことが保証されています。説明にそれを追加します。 – nishant

+2

なぜ 'age'は' long'ですか? – shmosel

答えて

3
objList.stream() 
     .min(Comparator.comparingLong(MyObj::getAge)) 
     .orElseThrow(AssertionError::new) 
     .getId() 
+0

'min'関数は' Optional 'を返しますか?したがって、この場合は 'Optional 'を返します。リストが空の場合、オプションは空になります。 – nishant

+1

@nishantそれは正しいです。 – shmosel

+1

またはストリームなし: 'Collections.min(objList、Comparator.comparingLong(MyObj :: getAge)).getId()' – Holger

5

はタイプMyObjectのものであり、オファーがgetAge()getId()をアクセサ、パイプラインは次のようになります。空の場合、これはIllegalArgumentException —を投げますが、それは「決して起こらないでしょう。または、default valueまたはgenerate one.

関連する問題