私は、データベース内の順序を作成するために使用される方法に従うが、順序は、多くの項目があると、アイテムは多くの紙幣を有します。iPadPOSOrderDTOは、データベースに保存されたベースに起こっているためです。
したがって、注文を作成するためのコードをベースループは以下の通りであります
private void createNewOrder(IPadPOSOrderDTO iPadPOSOrderDTO) {
IPadPOSOrderV2 order = mapper.map(iPadPOSOrderDTO, IPadPOSOrderV2.class);
if(order.getOrderV2Bills()!=null && order.getOrderV2Bills().size()>0){
for(IPadPOSOrderV2Bill orderBill : order.getOrderV2Bills()){
orderBill.setOrder(order);
if(orderBill.getiPadPOSOrderV2BillItems()!=null && orderBill.getiPadPOSOrderV2BillItems().size()>0){
for(IPadPOSOrderV2BillItems orderBillItem : orderBill.getiPadPOSOrderV2BillItems()){
orderBillItem.setiPadPOSOrderV2Bill(orderBill);
orderBillItem.setOrderId(order.getOrderId());
}
}
}
}
sessionFactory.
getCurrentSession().save(order);
}
私は、Java 8のストリームAPIを使用して、コードの上にリファクタリングしたかったです。
だから、私は次のことをやりました
private void createNewOrderV2(IPadPOSOrderDTO iPadPOSOrderDTO) {
IPadPOSOrderV2 order = mapper.map(iPadPOSOrderDTO, IPadPOSOrderV2.class);
if(order.getOrderV2Bills()!=null && order.getOrderV2Bills().size()>0){
order.getOrderV2Bills().stream().forEach(e -> { createBill(order,e);});
}
sessionFactory.
getCurrentSession().save(order);
}
private void createBill(IPadPOSOrderV2 ipadExistingOrderFromDatabase, IPadPOSOrderV2Bill iPadPOSOrderV2Bill) {
iPadPOSOrderV2Bill.setOrder(ipadExistingOrderFromDatabase);
if(iPadPOSOrderV2Bill.getiPadPOSOrderV2BillItems()!=null && iPadPOSOrderV2Bill.getiPadPOSOrderV2BillItems().size()>0){
iPadPOSOrderV2Bill.getiPadPOSOrderV2BillItems().stream().forEach(e -> createBillItem(ipadExistingOrderFromDatabase,iPadPOSOrderV2Bill,e));
}
}
private void createBillItem(IPadPOSOrderV2 ipadExistingOrderFromDatabase, IPadPOSOrderV2Bill iPadPOSOrderV2Bill, IPadPOSOrderV2BillItems iPadPOSOrderV2BillItem) {
iPadPOSOrderV2BillItem.setiPadPOSOrderV2Bill(iPadPOSOrderV2Bill);
iPadPOSOrderV2BillItem.setOrderId(ipadExistingOrderFromDatabase.getOrderId());
ipadExistingOrderFromDatabase.getOrderV2Bills().stream().forEach(e -> { createBill(ipadExistingOrderFromDatabase,e);});
}
私はこのリファクタリングのためのストリームAPIの正しい使用を作っていた場合、誰かが自分の経験やアドバイス私を共有することができます。
これらのサイズのチェックが本当に必要ではないことに注意してください。空のリストが空のストリームにつながるので、何も適用されませんになるだろう。唯一の利点は、あなたが完全にストリームを作成することを避けることができるだろうということでしょうが、私は非常にパフォーマンスの差はさらにnoticebleことはないだろう。
あなたがストリームに潜在的にNULLのコレクションを変換したい場合は、小さなヘルパー関数を使用する場合があります:
public <T> Stream<T> collectionToStream(Collection<T> collection) {
return Optional.ofNullable(collection).map(Collection::stream).orElseGet(Stream::empty);
}
使用してforEach()
、このような何かを行うことができますが。
private void createNewOrder(IPadPOSOrderDTO iPadPOSOrderDTO) {
IPadPOSOrderV2 order = mapper.map(iPadPOSOrderDTO, IPadPOSOrderV2.class);
collectionToStream(order.getOrderV2Bills()).forEach( orderBill -> {
orderBill.setOrder(order);
collectionToStream(orderBill.getiPadPOSOrderV2BillItems()).forEach(orderBillItem -> {
orderBillItem.setiPadPOSOrderV2Bill(orderBill);
orderBillItem.setOrderId(order.getOrderId());
}
}
}
}
sessionFactory.getCurrentSession().save(order);
}
これは、そのあなたの最初のコードとは異なるので、あなたはその変換が理にかなっているかどうかを考えるべきではないことに注意してください。
完全に順次ストリームにあなたのネストされたループを変換することは難しくなると考えエンドではないという別の理由することができますだけでなく、フラットなマップorderBill
のストリームへorderBillItem
。それを行うことはしないだろうorderBill
あなたが呼び出す必要があるだろうので、下流利用できるorderBillItem.setiPadPOSOrderV2Bill(orderBill);
前に、ネストされたストリームを返します。すなわち、上記と非常によく似たコードに終わると、あなたが返されたストリームを使用していないので、何のメリットを追加しないだろう。