2017-02-02 18 views
-1

Stream APIを使用してマップのリストからLongのリストを取得しようとしています。Java 8ストリーム:マップのリストを解析する

これは、クラスがどのように見えるかされています( "ID"、1)、( "名前"、 "テスト名"):

class Report Bean{ 
    private MarshallableMap data; 
} 

オブジェクトのデータは、このようなレコードが含まれます。

ReportBeansのリストからIDのリストを取得する必要があります。 これは私が試したものです:

List<Long> ids = reportBeans.stream().flatMap(
        m -> m.getData().entrySet().stream() 
          .filter(e -> e.getKey().equals("ID")) 
          .map(Map.Entry::getValue) 
          .map(Long.class::cast)) 
          .collect(Collectors.toList()); 

私は空リストを取得しています。私は助言が必要です。ありがとうございます

+0

は、あなたが正確に '「ID」'であるキーを持つすべての豆があることを確認している:あなたの「データ」フィールドは、タイプMap<String, String>である場合しかし、あなたは次のようにIDのリストを得ることができますか? – Moira

+0

'MarshallableMap'が構成するものを分かち合う。 'ID'はどう関連していますか?そして、おそらくクラス名 'ReportBean'の入力ミスです。 – nullpointer

答えて

3

多くの不必要なストリーミングがあります。これはあなたのニーズに適していると思います。

reportBeans.stream() 
    .map(r -> r.getData().get("ID")) 
    .filter(Objects::nonNull) 
    .map(Long.class:cast) 
    .collect(toList()); 
0

あなたのクラス「MarshallableMap」の外観は表示されていません。私たちは正確な答えを提供する必要があります。

 List<Long> ids = reportBeans.stream() 
     .flatMap(
       m -> (m.getData().entrySet().stream() 
         .filter(e -> "ID".equals(e.getKey())) 
         .map(e -> Long.valueOf(e.getValue()))) 
     ) 
     .collect(Collectors.toList()); 
+1

なぜあなたは' entrySet'を反復することを主張していますか? –

+0

@MikhailProkhorov、誰がそれを主張していますか?私の答えは、最小限の変更でOPのコードの修正を提供するだけです。ここで話題にならないプログラムを改善する方法は常にあります。 – VHS

関連する問題