這是我的串列,現在我必須使用 Java 添加屬于特定 itemId 的物件,
[
{
"data": 210,
"dataValue":100
"itemIds": "60e53dee7a814f0001de3538"
},
{
"data": 220,
"dataValue":120
"itemIds": "60e53dee7a814f0001de3538"
},
{
"data": 110,
"dataValue":130
"itemIds": "60e53dee7a814f0001de3539"
}
]
需要輸出 ->
[
{
"data": 430,
"dataValue":220
"itemIds": "60e53dee7a814f0001de3538"
},
{
"data": 110,
"dataValue":130
"itemIds": "60e53dee7a814f0001de3539"
}
]
uj5u.com熱心網友回復:
你可以做這樣的事情
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ListElement {
public static void main(String[] args) {
List<ListElement> elements = new ArrayList<ListElement>();
elements.add(new ListElement(210, 100, "60e53dee7a814f0001de3538"));
elements.add(new ListElement(220, 120, "60e53dee7a814f0001de3538"));
elements.add(new ListElement(110, 130, "60e53dee7a814f0001de3539"));
System.out.println(elements);
Map<String, List<ListElement>> elementsByItemId = elements.stream() //
.collect(Collectors.groupingBy(ListElement::getItemId)); //
elements = elementsByItemId.entrySet().stream() //
.map(entry -> new ListElement( //
entry.getValue().stream().collect(Collectors.summingInt(ListElement::getData)), //
entry.getValue().stream().collect(Collectors.summingInt(ListElement::getDataValue)), //
entry.getKey())) //
.collect(Collectors.toList());
System.out.println(elements);
}
int data;
int dataValue;
String itemId;
public ListElement(int data, int dataValue, String itemId) {
this.data = data;
this.dataValue = dataValue;
this.itemId = itemId;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public int getDataValue() {
return dataValue;
}
public void setDataValue(int dataValue) {
this.dataValue = dataValue;
}
public String getItemId() {
return itemId;
}
public void setItemId(String itemId) {
this.itemId = itemId;
}
@Override
public String toString() {
return "ListElement [data=" data ", dataValue=" dataValue ", itemId=" itemId "]";
}
}
uj5u.com熱心網友回復:
這將是如何做到這一點的一個不完美的例子。也許您可以根據自己的喜好改進此解決方案。為簡單起見,它使用內部類和公開的欄位。我相信你會避免這樣做:) 它使用自定義聚合運算子和流的 reduce 方法(請參閱java stream reduce 教程或java stream reduce doc)
private static BinaryOperator<Item> itemAggregator = (aggregatedResult, nextElement) -> {
aggregatedResult.data = nextElement.data;
aggregatedResult.dataValue = nextElement.dataValue;
return aggregatedResult;
};
public static void something(List<Item> initialItemList) {
Set<String> uniqueItemIds = initialItemList.stream()
.map(item -> item.itemId)
.collect(Collectors.toSet());
List<Item> resultList = uniqueItemIds.stream()
.map(itemId -> new Item(0, 0, itemId))
.collect(Collectors.toList());
resultList.forEach(
resultItem -> {
initialItemList.stream()
.filter(item -> item.itemId.equals(resultItem.itemId))
.reduce(resultItem, itemAggregator);
});
}
static class Item {
public int data;
public int dataValue;
public String itemId;
public Item(int data, int dataValue, String itemId) {
this.data = data;
this.dataValue = dataValue;
this.itemId = itemId;
}
}
但請注意,使用 reduce 方法很容易出錯(請參閱如果可能避免減少),您必須檢查它在您的背景關系中是否有意義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/376763.html
