Refactorización de código Java para bucle de usar Java 8 API de Secuencia

Kitis:

He método que se utiliza para crear un orden en la base de datos siguiente, orden y tiene muchos artículos, artículo tiene muchas cuentas. iPadPOSOrderDTO es el orden que se va a base de salvado en la base de datos.

así, el código basado bucle para la creación de orden es el siguiente

 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);
}

Quería perfeccionar por encima de código para utilizar Java 8 flujos de API.

Por lo tanto, hice la siguiente

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);});
    }

alguien puede compartir su experiencia y asesoramiento si yo estoy haciendo el uso correcto de los flujos de API para esta refactorización.

Thomas:

Tenga en cuenta que estos controles de tamaño no son realmente necesarios. Una lista vacía daría lugar a un flujo de vacío y por lo tanto nada conseguiría aplicado. El único beneficio sería que usted sería capaz de evitar tener que crear la corriente por completo, pero dudo mucho la diferencia de rendimiento incluso sería noticeble.

Si desea convertir una colección potencialmente nula a una corriente es posible que desee utilizar una pequeña función auxiliar:

public <T> Stream<T> collectionToStream(Collection<T> collection) {
  return Optional.ofNullable(collection).map(Collection::stream).orElseGet(Stream::empty);
}

Usando forEach()entonces podría hacer algo como esto:

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);
}

Tenga en cuenta que esto no es tan diferente de su código inicial y por lo tanto usted debe pensar si esa conversión tendría sentido.

Convertir sus bucles anidados a una corriente totalmente secuencial sería más difícil y al final no es tan diferente porque no se puede simplemente mapa plano orderBillde una corriente de orderBillItem. Hacer eso no tendría orderBilldisponible río abajo por lo que tendría que llamar orderBillItem.setiPadPOSOrderV2Bill(orderBill); antes de devolver la corriente anidada. Eso sería terminar en código muy similar a la anterior y añade ningún beneficio porque no se está utilizando el flujo devuelto.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=282641&siteId=1
Recomendado
Clasificación