Java lambda返回有重复代码问题的列表



当我试图通过lambda表达式获得列表时,我有一个问题. 代码看起来像

Collection<Order> updateOrders = orderCodes.stream().filter(orderCode -> {
List<String> iccids = new ArrayList<>();
ShippedOrder shippedOrder = orderMap.get(orderCode);
iccids.addAll(getSimEsnByShippedOrder(shippedOrder));
Optional<Order> maybeOrder = orderRepository.findByCode(orderCode);

return maybeOrder.isPresent() && !iccids.isEmpty();
}).map(orderCode -> {
List<String> iccids = new ArrayList<>();
ShippedOrder shippedOrder = orderMap.get(orderCode);
iccids.addAll(getSimEsnByShippedOrder(shippedOrder));
Optional<Order> maybeOrder = orderRepository.findByCode(orderCode);

Order order = maybeOrder.get();
List<String> existedEsnList = order.getEsnList();
if(!existedEsnList.isEmpty())
iccids.addAll(existedEsnList);
order.setEsnList(iccids);

return order;
}).collect(Collectors.toList());

显然,filter()和map()中出现了一段重复的代码,并且出于同样的原因访问了数据库2次。如何减少代码?由于

第一个解决方案可能是:

List<String> l = List.of("a", "b", "c");
l.stream().map((String orderCode)->{
boolean isOrderPresent = true;
if(isOrderPresent)
return orderCode + " order"; //return Order object
else
return null;
})
.filter(ss-> ss!= null)
.map((String order) -> {
System.out.println(order); // else use order.orderCode
return order;
}).collect(Collectors.toList());

或者你可以维护一个<OrderCode,>这样的:

List<String> l = List.of("a", "b", "c");
Map<String, String> map = new HashMap<>();
l.stream().filter((String s)->{
map.put(s, s+" order");
return !s.isEmpty();
})
.forEach((String s) -> {
System.out.println(map.get(s));  //<== retrieve Orders from local map
});

如何映射到空值并过滤空值?它应该是这样的:

Collection<Order> updateOrders = orderCodes.stream().map(orderCode -> {
List<String> iccids = new ArrayList<>();
ShippedOrder shippedOrder = orderMap.get(orderCode);
iccids.addAll(getSimEsnByShippedOrder(shippedOrder));
Optional<Order> maybeOrder = orderRepository.findByCode(orderCode);
if (maybeOrder.isPresent && !iccids.isEmpty) {
return getObject(iccids, maybeOrder);
} else {
return null;
}
}).filter(Objects::nonNull).collect(Collectors.toList());

其中getObject

private Object getObject(List<String> iccids, Optional<Order> maybeOrder) {
Order order = maybeOrder.get();
List<String> existedEsnList = order.getEsnList();
if(!existedEsnList.isEmpty())
iccids.addAll(existedEsnList);
order.setEsnList(iccids);
return order;
}

最新更新