当我试图通过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;
}