将增强型for each循环转换为streams java 8

将增强型for each循环转换为streams java 8,java,java-8,java-stream,Java,Java 8,Java Stream,我正在尝试将用enhanced for each循环编写的代码转换为java中的流。 这是我的传统代码 List<OrderDetail> orderDetails = new ArrayList<>(); if (arInvoiceOrderResponseBody != null) { if (arInvoiceOrderResponseBody.getOrders() != null && arIn

我正在尝试将用enhanced for each循环编写的代码转换为java中的流。 这是我的传统代码

    List<OrderDetail> orderDetails = new ArrayList<>();
    if (arInvoiceOrderResponseBody != null) {
        if (arInvoiceOrderResponseBody.getOrders() != null && 
         arInvoiceOrderResponseBody.getOrders().size() > 0) {
         for (OrderDetail orderDetail : arInvoiceOrderResponseBody.getOrders()) {
                if (orderDetail != null) {
                    if (orderDetail.getStatusHistory() != null && 
                        orderDetail.getStatusHistory().size() > 0) {
                        for (StatusHistory statusHistory : orderDetail.getStatusHistory()) {
                            if (statusHistory != null) {
                                if (statusHistory.getStatusCode() != null) {
                                    if (statusHistory.getStatusCode().equals("POD")) {
                                        orderDetail.setStatusDateTime(statusHistory.getStatus_date_time());
                                    }
                                }

                            }
                        }
                    }
                }
                orderDetails.add(orderDetail);
            }
            arInvoiceOrderResponseBody.setOrders(orderDetails);
        }

以下是我认为将要用到的Java-8

arinVoiceOrderResponseBy.getOrders().forEach(
orderDetail->orderDetail.getStatusHistory().stream()
.filter(statusHistory->“POD”.equals(statusHistory.getStatusCode()))
.findFirst()
.ifPresent(statusHistory->orderDetail.setStatusDateTime(statusHistory.getStatus\u date\u time()))
);

我注意到原始代码更改了现有的
OrderDetail
实例,但随后将它们(全部)放入新集合并替换原始集合。从表面上看,这似乎毫无意义

以下是我认为将要用到的Java-8

arinVoiceOrderResponseBy.getOrders().forEach(
orderDetail->orderDetail.getStatusHistory().stream()
.filter(statusHistory->“POD”.equals(statusHistory.getStatusCode()))
.findFirst()
.ifPresent(statusHistory->orderDetail.setStatusDateTime(statusHistory.getStatus\u date\u time()))
);

我注意到原始代码更改了现有的
OrderDetail
实例,但随后将它们(全部)放入新集合并替换原始集合。从表面上看,这似乎毫无意义

将其拆分为多个方法并将其拆分为两个流可能有效。比如:

  public static ResponseBody processResponseBody(ResponseBody responseBody)
  {
    if(validate(responseBody))
    {
      List<OrderDetail> orderDetails = responseBody.getOrders().stream()
          .filter(od -> validate(od))
          .map(od -> processOrderDetail(od))
          .collect(Collectors.toList());
      responseBody.setOrders(orderDetails);
    }
    
    return responseBody;
  }
  
  private static OrderDetail processOrderDetail(OrderDetail orderDetail)
  {
    StatusHistory statusHistory = orderDetail.getStatusHistory().stream()
          .filter(sh -> validate(sh))
          .findFirst()
          .orElseThrow(() -> new IllegalArgumentException("No Status History Found"));
    orderDetail.setStatusDateTime(statusHistory.getStatus_date_time());

    return orderDetail;
  }
  
  private static boolean validate(ResponseBody responseBody)
  {
    return responseBody != null && responseBody.getOrders() != null && responseBody.getOrders().size() > 0;
  }
  
  private static boolean validate(OrderDetail orderDetail)
  {
    return orderDetail != null && orderDetail.getStatusHistory() != null && orderDetail.getStatusHistory().size() > 0;
  }
  
  private static boolean validate(StatusHistory statusHistory)
  {
    return statusHistory != null && statusHistory.getStatusCode() != null && statusHistory.getStatusCode().equals("POD");
  }
public静态ResponseBody processResponseBody(ResponseBody ResponseBody)
{
如果(验证(响应库))
{
List orderDetails=responseBody.getOrders().stream()
.过滤器(od->验证(od))
.map(od->processOrderDetail(od))
.collect(Collectors.toList());
responseBody.setOrders(orderDetails);
}
返回响应体;
}
私有静态OrderDetail processOrderDetail(OrderDetail OrderDetail)
{
StatusHistory StatusHistory=orderDetail.getStatusHistory().stream()
.filter(sh->validate(sh))
.findFirst()
.orelsetrow(()->新的IllegalArgumentException(“未找到状态历史”);
orderDetail.setStatusDateTime(statusHistory.getStatus_date_time());
退货订单详情;
}
私有静态布尔验证(ResponseBody ResponseBody)
{
return responseBody!=null&&responseBody.getOrders()!=null&&responseBody.getOrders().size()>0;
}
私有静态布尔验证(OrderDetail OrderDetail)
{
返回orderDetail!=null&&orderDetail.getStatusHistory()!=null&&orderDetail.getStatusHistory().size()>0;
}
私有静态布尔验证(StatusHistory StatusHistory)
{
返回statusHistory!=null&&statusHistory.getStatusCode()!=null&&statusHistory.getStatusCode().equals(“POD”);
}

我将其分解为一个流来处理
OrderDetail
对象,并将
StatusHistory
简化为单个对象。为了简洁和组织,我还将验证分解为各自的方法。

将其分解为多个方法,并将其分解为两个流可能会奏效。比如:

  public static ResponseBody processResponseBody(ResponseBody responseBody)
  {
    if(validate(responseBody))
    {
      List<OrderDetail> orderDetails = responseBody.getOrders().stream()
          .filter(od -> validate(od))
          .map(od -> processOrderDetail(od))
          .collect(Collectors.toList());
      responseBody.setOrders(orderDetails);
    }
    
    return responseBody;
  }
  
  private static OrderDetail processOrderDetail(OrderDetail orderDetail)
  {
    StatusHistory statusHistory = orderDetail.getStatusHistory().stream()
          .filter(sh -> validate(sh))
          .findFirst()
          .orElseThrow(() -> new IllegalArgumentException("No Status History Found"));
    orderDetail.setStatusDateTime(statusHistory.getStatus_date_time());

    return orderDetail;
  }
  
  private static boolean validate(ResponseBody responseBody)
  {
    return responseBody != null && responseBody.getOrders() != null && responseBody.getOrders().size() > 0;
  }
  
  private static boolean validate(OrderDetail orderDetail)
  {
    return orderDetail != null && orderDetail.getStatusHistory() != null && orderDetail.getStatusHistory().size() > 0;
  }
  
  private static boolean validate(StatusHistory statusHistory)
  {
    return statusHistory != null && statusHistory.getStatusCode() != null && statusHistory.getStatusCode().equals("POD");
  }
public静态ResponseBody processResponseBody(ResponseBody ResponseBody)
{
如果(验证(响应库))
{
List orderDetails=responseBody.getOrders().stream()
.过滤器(od->验证(od))
.map(od->processOrderDetail(od))
.collect(Collectors.toList());
responseBody.setOrders(orderDetails);
}
返回响应体;
}
私有静态OrderDetail processOrderDetail(OrderDetail OrderDetail)
{
StatusHistory StatusHistory=orderDetail.getStatusHistory().stream()
.filter(sh->validate(sh))
.findFirst()
.orelsetrow(()->新的IllegalArgumentException(“未找到状态历史”);
orderDetail.setStatusDateTime(statusHistory.getStatus_date_time());
退货订单详情;
}
私有静态布尔验证(ResponseBody ResponseBody)
{
return responseBody!=null&&responseBody.getOrders()!=null&&responseBody.getOrders().size()>0;
}
私有静态布尔验证(OrderDetail OrderDetail)
{
返回orderDetail!=null&&orderDetail.getStatusHistory()!=null&&orderDetail.getStatusHistory().size()>0;
}
私有静态布尔验证(StatusHistory StatusHistory)
{
返回statusHistory!=null&&statusHistory.getStatusCode()!=null&&statusHistory.getStatusCode().equals(“POD”);
}

我将其分解为一个流来处理
OrderDetail
对象,并将
StatusHistory
简化为单个对象。为了简洁和组织,我还将验证分解为他们自己的方法。

将其编辑到您的问题中,注释不利于在我看到的问题中显示CodeEdit。是的,正如您遇到的问题所示,使用流解决这个问题并不合适。这是可能的,但是没有比你已经拥有的更好的东西。当我尝试在筛选后再次获取主订单对象时,我被卡住了,因为如果条件为真,那么我需要设置主订单对象的属性和内部对象状态历史的属性将其编辑到你的问题中,评论不适合在我看到的问题中显示代码编辑。是的,正如您遇到的问题所示,使用流解决这个问题并不合适。有可能,但没有比您已有的更好的内容。我在尝试在筛选后再次获取主订单对象时遇到了问题,因为如果条件为true,则需要将主订单对象的属性设置为“内部对象状态历史记录”是,因为在修改订单详细对象后,我需要发送更新的集合响应。因此我将其添加到新集合并返回新订单详细信息集合是,因为在修改订单de之后