3 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
要實(shí)現(xiàn)這一點(diǎn),有兩種方法:
如果存在具有相同名稱的條目,則繼承
ArrayList
并覆蓋添加方法并添加邏輯以求和權(quán)重。
@JsonDeserialize
在反序列化 JSON 時(shí)使用。首選哪個(gè)選項(xiàng),為什么?
順便說一下,您不應(yīng)該使用這些方法中的任何一種。見下文:
add()
應(yīng)避免覆蓋執(zhí)行計(jì)算的方法。您可以利用流來處理已添加到列表中的數(shù)據(jù)。Jackson 應(yīng)該只用于 JSON 解析,而不用于執(zhí)行業(yè)務(wù)邏輯。
事實(shí)上,您應(yīng)該做的是在控制器層接收 JSON,將其解析為列表,然后委托給服務(wù)層,您將在服務(wù)層執(zhí)行分組和求和操作。
此外,重要的是要提到您必須避免在計(jì)算中同時(shí)使用Float
和Double
類型,因?yàn)樗鼈冊诰确矫娲嬖趩栴}。改用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());
}
并確保您具有以下靜態(tài)導(dǎo)入:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.reducing;
import static java.util.stream.Collectors.toList;

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以處理服務(wù)中的對象列表或創(chuàng)建解釋器來處理對象列表,而不是使用自定義實(shí)現(xiàn)來添加或使用 @JsonDeserialize。您可以將以下代碼添加到進(jìn)程列表中,
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貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
這聽起來像是區(qū)分控制器和服務(wù)層的基本原因。讓控制器接受純列表并將其交給進(jìn)行處理的服務(wù)。
@Controller class MyController {
@Autowired MyService service;
@PostMapping(..) void postList(@Body List<B> items) {
service.accept(items);
}
}
在服務(wù)中,您可以添加權(quán)重。
@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);
}
}
添加回答
舉報(bào)