Обратите внимание, что эти проверки размера не являются действительно необходимыми. Пустой список приведет к пустому потоку и, следовательно, ничего не будет применено. Единственным преимуществом будет то, что вы сможете избежать создания потока в целом, но я очень сомневаюсь, что разница в производительности будет даже заметной.
Если вы хотите преобразовать потенциально нулевую коллекцию в поток, вы Возможно, вы захотите использовать небольшую вспомогательную функцию:
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);
, прежде чем вернет вложенный поток. Это приведет к тому, что код будет очень похож на приведенный выше и не принесет никакой пользы, поскольку вы не используете возвращаемый поток.