2016-09-14 16 views
1

エントリ私はのJava 8のストリームAPIは

Parameterのように定義された列挙型です
Map<String, List<Entry<Parameter, String>>> 

で作業する必要があることをJavaで次のコンテナは、以下の持っている:

public enum Parameter { 
    Param1, 
    Param2, 
    Param3 
} 

以下のコードは、マップ構造をどのように初期化するかを示しています。

Map<String, List<Entry<Parameter, String>>> map2 = new HashMap<String, List<Entry<Parameter, String>>>() {{ 
     put("SERVICE1", new ArrayList<Entry<Parameter, String>>(){{ 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param1,"val1")); 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param2,"val2")); 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param3,"val3")); 
     }}); 
     put("SERVICE2", new ArrayList<Entry<Parameter, String>>(){{ 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param1,"val4")); 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param2,"val5")); 
      add (new AbstractMap.SimpleEntry<>(Parameter.Param3,"val6")); 
     }}); 
    }}; 

私は「SERVICE1」からval1val2値を見つけるためにJava 8つのストリームAPIを使用する必要がありますが、私は正しいJavaストリームフィルタとマッピング構文を知りません。私が思い付くことができ

最も近いものは以下の通りであるが、これだけトップレベルのフィルタと、それはリストのリストではなく、私はSERVICE1行から探していますParameter.Param1,"val1" & Parameter.Param2,"val3"のリストを返します。

List<List<Entry<Parameter, String>>> listOfLists = myMap.entrySet().stream() 
      .filter(next -> next.getKey().equals("SERVICE1")) 
      .map(Map.Entry::getValue) 
      .collect(Collectors.toList()); 
    listOfLists.size(); 

答えて

3

あなただけの「VAL1」と「val2の」値が必要な場合は、最初に対応するリストを取得するためにgetOrDefaultを使用して、キーとしてParam1またはParam2でエントリを取得するためにエントリキーにフィルタリングすることができ、最後にマップを再度適用してこれらのエントリの値を取得します。また

List<String> list = 
    myMap.getOrDefault("SERVICE1", Collections.emptyList()) 
     .stream() 
     .filter(e -> e.getKey() == Parameter.Param1 || e.getKey() == Parameter.Param2) 
     .map(Map.Entry::getValue) 
     .collect(Collectors.toList()); 

あなたはEfficiency of Java "Double Brace Initialization"?

+0

ニースを見て興味があるかもしれませんが、次の(現在のトップレベルのフィルタに残し、同じ結果達成するためのいくつかの方法がある - 。> next.getKey()イコール( "SERVICE1"))私は現在、その場所にあるか、常にリストのリストを返すだろう。私が書いたコードはほぼそこにあると思いますが、リストのリストの最初のものを返すだけの何らかの方法があります。 – johnco3

+2

@ johnco3さて、 'map'の代わりに' flatMap'を使い、 '.filter(next - > next.getKey()。equals(" SERVICE1 "))と同じように項目をフィルタリングしてください。 (Map.Entry :: getValue).collect。getValue()。stream()).filter(e - > e.getKey()== Parameter.Param1 || e.getKey()== Parameter.Param2) (...) '。しかし、特定のキーを使ったマッピングに興味があるので、この方法では1つのリストしか持たないので、メリットはありません。 –

+2

...キーのフィルタリングが 'next - > next.getKey()。startsWith(" SERVICE ")'のような複数のリストを導くことができない場合を除きます。 –

関連する問題