3 回答

TA貢獻1851條經驗 獲得超5個贊
要實現這一點,有兩種方法:
如果存在具有相同名稱的條目,則繼承
ArrayList
并覆蓋添加方法并添加邏輯以求和權重。
@JsonDeserialize
在反序列化 JSON 時使用。首選哪個選項,為什么?
順便說一下,您不應該使用這些方法中的任何一種。見下文:
add()
應避免覆蓋執行計算的方法。您可以利用流來處理已添加到列表中的數據。Jackson 應該只用于 JSON 解析,而不用于執行業務邏輯。
事實上,您應該做的是在控制器層接收 JSON,將其解析為列表,然后委托給服務層,您將在服務層執行分組和求和操作。
此外,重要的是要提到您必須避免在計算中同時使用Float
和Double
類型,因為它們在精度方面存在問題。改用BigDecimal
。
最后,這是您的分組和求和方法BigDecimal
:
public List<B> groupByNameAndSumWeight(List<B> list) {
return list.stream()
.collect(groupingBy(B::getName, reducing(BigDecimal.ZERO, B::getWeight, BigDecimal::add)))
.entrySet().stream()
.map(entry -> new B(entry.getKey(), entry.getValue()))
.collect(toList());
}
并確保您具有以下靜態導入:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.reducing;
import static java.util.stream.Collectors.toList;

TA貢獻1801條經驗 獲得超8個贊
您可以處理服務中的對象列表或創建解釋器來處理對象列表,而不是使用自定義實現來添加或使用 @JsonDeserialize。您可以將以下代碼添加到進程列表中,
objects = objects.stream().collect(Collectors.groupingBy(B::getName, Collectors.summingDouble(B::getWeight))) .entrySet().stream().map(ele-> new B(ele.getKey(), ele.getValue())) .collect(Collectors.toList());
希望能幫助到你。

TA貢獻1810條經驗 獲得超4個贊
這聽起來像是區分控制器和服務層的基本原因。讓控制器接受純列表并將其交給進行處理的服務。
@Controller class MyController {
@Autowired MyService service;
@PostMapping(..) void postList(@Body List<B> items) {
service.accept(items);
}
}
在服務中,您可以添加權重。
@Service class MyService {
JpaRepository<B> repository;
public void accept(List<B> items) {
List<B> summed =
items.stream().collect(groupingBy(B::getName, summarizingDouble(B::getWeight)))
.entrySet().stream().map(e -> new B(e.getKey(), e.getValue()))
.collect(toList());
repository.save(summed);
}
}
添加回答
舉報