我執行了一個查詢并獲得了這個物件的結果串列:
public MyObject {
private String key;
private String value1;
private Integer value2;
}
結果如下所示:
鍵值1 值2
1 WWW EEE
1 WWW AAA
2 WW??W EEE
我想迭代這個串列并創建一個類似這樣的串列,按鍵分組。
//first object of the list
public MyCreatedObject {
private String key; //1
private List<Value1> value1List; //WWW, WWW
private List<Value2> value2List; //EEE, AAA
}
//second object of the list
public MyCreatedObject {
private String key; //2
private List<Value1> value1List; //WWW
private List<Value2> value2List; //EEE
}
我嘗試使用流、迭代和一些東西,但我真的很掙扎。
有人可以給我一些幫助嗎?
非常感謝各位
uj5u.com熱心網友回復:
您可以MyCreatedObject通過添加幾個方法來用作收集器:
static Collector<MyObject, ?, MyCreatedObject> collector() {
return Collector.of(MyCreatedObject::new, MyCreatedObject::add, MyCreatedObject::merge);
}
void add(MyObject o) {
key = o.key;
value1List.add(o.value1);
value2List.add(o.value2);
}
MyCreatedObject merge(MyCreatedObject other) {
key = other.key;
value1List.addAll(other.value1List);
value2List.addAll(other.value2List);
return this;
}
然后將其用作下游收集器groupingBy():
Map<String, MyCreatedObject> grouped = list.stream()
.collect(Collectors.groupingBy(o -> o.key, MyCreatedObject.collector()));
Ideone 演示
或者,您可以add()使用toMap()以下方法轉換為建構式和組:
Map<String, MyCreatedObject> grouped = list.stream()
.collect(Collectors.toMap(o -> o.key, MyCreatedObject::new, MyCreatedObject::merge));
Ideone 演示 2
uj5u.com熱心網友回復:
嘗試這個。
record MyObject(String key, String value1, String value2) {}
record MyCreatedObject(String key, List<String> value1List, List<String> value2List) {}
public static void main(String[] args) {
List<MyObject> list = List.of(
new MyObject("1", "WWW", "EEE"),
new MyObject("1", "WWW", "AAA"),
new MyObject("2", "WWW", "EEE"));
Map<String, MyCreatedObject> map = new LinkedHashMap<>();
for (MyObject obj : list) {
MyCreatedObject c = map.computeIfAbsent(obj.key(),
k -> new MyCreatedObject(k, new ArrayList<>(), new ArrayList<>()));
c.value1List().add(obj.value1());
c.value2List().add(obj.value2());
}
List<MyCreatedObject> result = new ArrayList<>(map.values());
for (MyCreatedObject obj : result)
System.out.println(obj);
}
輸出:
MyCreatedObject[key=1, value1List=[WWW, WWW], value2List=[EEE, AAA]]
MyCreatedObject[key=2, value1List=[WWW], value2List=[EEE]]
uj5u.com熱心網友回復:
Collectors.toMap使用合并函式可用于構建映射Map<String, MyCreatedObject>,然后將其值轉換為串列,MyCreatedObject前提是提供了適當的 all-args 建構式:
List<MyObject> input = ... ; // setup input data
List<MyCreatedObject> result = new ArrayList<>(input
.stream()
.collect(Collectors.toMap(
MyObject::getKey, //
mo -> new MyCreatedObject(
mo.getKey(),
new ArrayList<>(Arrays.asList(mo.getValue1())),
new ArrayList<>(Arrays.asList(mo.getValue2()))
),
(co1, co2) -> { // merge inner lists in MyCreatedObject
co1.getValue1List().addAll(co2.getValue1List());
co1.getValue2List().addAll(co2.getValue2List());
return co1;
}
//, LinkedHashMap::new // optional supplier to keep insertion order
))
.values()
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/373956.html
