首页 > 解决方案 > 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次。如何减少代码?谢谢

标签: javalambdaspring-data-jpa

解决方案


第一个解决方案可能是:

    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, Order> 的映射:

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

推荐阅读