エントリ私はの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
」からval1
とval2
値を見つけるために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();
ニースを見て興味があるかもしれませんが、次の(現在のトップレベルのフィルタに残し、同じ結果達成するためのいくつかの方法がある - 。> next.getKey()イコール( "SERVICE1"))私は現在、その場所にあるか、常にリストのリストを返すだろう。私が書いたコードはほぼそこにあると思いますが、リストのリストの最初のものを返すだけの何らかの方法があります。 – johnco3
@ 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つのリストしか持たないので、メリットはありません。 –
...キーのフィルタリングが 'next - > next.getKey()。startsWith(" SERVICE ")'のような複数のリストを導くことができない場合を除きます。 –