简体   繁体   English

使用流将自定义对象列表合并到单个列表 Object Java 8

[英]Merge List of Custom Objects to a Single List Object using Streams Java 8

I have ProductInfo object which looks like this我有 ProductInfo object 看起来像这样

ProductInfo.java ProductInfo.java

    public class ProductInfo
    {
    private List<String> servicetagInfo;
    }

I have Order object like this which has list of Products info我有这样的订单 object,其中包含产品信息列表

OrderDetail.java OrderDetail.java

    public class OrderDetail
    {
    private String orderNum;
    private List<ProductInfo> productInfo;
    }
    

And then I have a Response object which basically has List of Order objects然后我有一个响应 object 基本上有订单对象列表

Response.java响应.java

    public class Response
    {
    private List<OrderDetail> orderInfo;
    }  

I am getting response as expected.But right now in this format我得到了预期的回应。但现在以这种格式

    orderInfo:
    0: {orderNum: "162293591",...}
     productInfo:
     0: {servicetag_info: ["7LSMW33", "49SMW33"]}
     1: {servicetag_info: ["JF6XN33", "CQ5XN33"]}
     2: {servicetag_info: ["5VRR523", "13LR523"]}

Here I am trying to merge productInfo List to be like this在这里,我正在尝试将 productInfo List 合并为这样

    productInfo:
    0: {servicetag_info: ["7LSMW33", "49SMW33","JF6XN33", "CQ5XN33","5VRR523", "13LR523"]}

Just add all strings into one main property.只需将所有字符串添加到一个主要属性中。

Here is my code这是我的代码

    List<String> serviceTagList = new ArrayList<>();
    for (OrderDetail orderDetail : arInvoiceOrderResponseBody.getOrders()) {  //Here i am getting orders from external service
        if (orderDetail != null) {
            if (orderDetail.getProductInfo() != null && orderDetail.getProductInfo().size() > 0) {
                for (ProductInfo productInfoDetail : orderDetail.getProductInfo()) {
                    if (productInfoDetail != null) {
                        if (productInfoDetail.getServicetagInfo() != null) {
                            for (String serviceTag : productInfoDetail.getServicetagInfo()) {
                                serviceTagList.add(serviceTag);
                            }
                       }
                    }
                }
            }
        }
        ProductInfo productInfo = new ProductInfo();
        productInfo.setServicetagInfo(serviceTagList);
        orderDetail.setProductInfo(Arrays.asList(productInfo));
    }         

Can anyone suggest how can i achieve same using streams in java so that it will be readable.谁能建议我如何使用 java 中的流来实现相同的目的,以便它可读。

Try this:尝试这个:

Set<String> tags = order.stream()
            .flatMap(order -> order.getProductInfo().stream())
            .map(ProductInfo::getServicetagInfo)
            .collect(Collectors.toSet());

Full implementation:全面实施:

for (OrderDetail orderDetail : arInvoiceOrderResponseBody.getOrders()) {
    if (orderDetail != null && orderDetail.getProductInfo() != null) {
        orderDetail.getProductInfo().removeAll(null); // Remove any null elems
        Set<String> tags = orderDetail.getProductInfo().stream()
            .flatMap(product -> (product.getServicetagInfo() == null) ? null : product.getServicetagInfo().stream())
            .collect(Collectors.toSet());
        tags.remove(null); // Remove null if exists
    }

    ProductInfo productInfo = new ProductInfo();
    productInfo.setServicetagInfo(tags);
    orderDetail.setProductInfo(Arrays.asList(productInfo));
}

With streams your code could be like this:使用流,您的代码可能是这样的:

arInvoiceOrderResponseBody.getOrders().stream()
            .filter(Objects::nonNull)
            .forEach(YourClassName::mergeProductInfo);

The method mergeProductInfo would be:方法mergeProductInfo将是:

private static void mergeProductInfo(OrderDetail orderDetail) {

    List<String> serviceTagList = new ArrayList<>();

    if (orderDetail.getProductInfo() != null) {
        serviceTagList = orderDetail.getProductInfo().stream()
                .filter(Objects::nonNull)
                .map(ProductInfo::getServicetagInfo)
                .filter(Objects::nonNull)
                .flatMap(Collection::stream)
                .collect(Collectors.toList());
    }

    ProductInfo productInfo = new ProductInfo();
    productInfo.setServicetagInfo(serviceTagList);
    orderDetail.setProductInfo(Arrays.asList(productInfo));
}

It could be simplified if you could be sure that you are not going to receive null lists or elements.如果您可以确定不会收到 null 列表或元素,则可以简化它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将单个对象和对象列表合并为Java中的单个对象列表 - Merge single objects and list of objects into a single list of objects in Java 使用 java8 (Streams) 的自定义对象比较列表 - List of custom object comparison using java8 (Streams) Java流对象列表 - Java streams list of objects 使用 java 8 流过滤列表中的对象 - filter Objects in list using java 8 streams 使用Java Streams按属性将对象列表组合在一起,并将它们减少为具有另一个属性平均值的新对象列表 - Using Java Streams to group together a List of objects by an attribute and reduce them to a new list of object with the average of another attribute 如何使用 Java 8 Streams 迭代包含列表对象作为值的 Map 并将其作为单独的列表 Object - How to iterate over a Map that contains List Objects as value and get those as a separate List Object using Java 8 Streams 使用 java 8 流过滤和修改列表对象 - Filter and modify list object using java 8 streams 如何使用 Java 流将多个列表转换为单个列表? - How to convert multiple list into single list using Java streams? 使用Java 8流从另一个列表创建对象列表 - Create a list of objects from another list using Java 8 streams 使用 Java 8 流通过布尔函数将对象列表分组为列表列表 - Grouping a list of objects into a list of lists by a boolean function using Java 8 streams
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM