からオブジェクトのMap
を作成する必要がある場合がよくあります。 キーは通常、いくつかのStringやEnumなどであり、値は一緒にまとめられた新しいオブジェクトです。 これを行う一般的な方法は、私のために、最初にMap<String, SomeKeyValueObject>
を作成してから、SetまたはListを反復して、新しく作成したマップを入れ替えます。次の例のようにJavaストリーム:マップに追加するが、突然変異を避ける
:
class Example {
Map<String, GroupedDataObject> groupData(final List<SomeData> list){
final Map<String, GroupedDataObject> map = new HashMap<>();
for(final SomeData data : list){
final String key = data.valueToGroupBy();
map.put(key, GroupedDataObject.of(map.get(key), data.displayName(), data.data()));
}
return map;
}
}
class SomeData {
private final String valueToGroupBy;
private final Object data;
private final String displayName;
public SomeData(final String valueToGroupBy, final String displayName, final Object data) {
this.valueToGroupBy = valueToGroupBy;
this.data = data;
this.displayName = displayName;
}
public String valueToGroupBy() {
return valueToGroupBy;
}
public Object data() {
return data;
}
public String displayName() {
return displayName;
}
}
class GroupedDataObject{
private final String key;
private final List<Object> datas;
private GroupedDataObject(final String key, final List<Object> list) {
this.key = key;
this.datas = list;
}
public static GroupedDataObject of(final GroupedDataObject groupedDataObject, final String key, final Object data) {
final List<Object> list = new ArrayList<>();
if(groupedDataObject != null){
list.addAll(groupedDataObject.datas());
}
list.add(data);
return new GroupedDataObject(key, list);
}
public String key() {
return key;
}
public List<Object> datas() {
return datas;
}
}
これは非常に汚れた感じ。マップを作成し、それを何度も繰り返します。
私はjava 8sの使用をStream
で行い、非突然変異型データ構造を作成しています(むしろ突然変異は見られません)。このようなデータのグループ化を、命令的な方法ではなく宣言的なアプローチを使用するものに変える方法はありますか?
私はhttps://stackoverflow.com/a/34453814/3478016で提案を実装しようとしましたが、私はつまずくようです。答えのアプローチ(Collectors.groupingBy
とCollectors.mapping
の使用を提案)を使用して、データをマップにソートすることができました。しかし、私は "データ"を1つの同じオブジェクトにグループ化することはできません。
宣言的な方法でそれを行う方法はありますか、それとも命令に固執していますか?
は、それはあなたが唯一の 'data.displayName(*最後に*をしたいです)' 'data.valueToGroupBy()'ごとに 'data.data()'がありますか? – Bohemian
@Bohemian 'data.displayName()'は各 'data.valueToGroupBy()'で同じです。私の現在の問題では、 'valueToGroupBy'は英語で、' displayName'はスウェーデン語です。しかし、彼らは同じです。 – Chewtoy
それは私の質問に答えません。はいまたはいいえ:各キーに表示されている最後のデータのみを出力マップに入れようとしていますか? – Bohemian