Java 8 Java8-流特性在从3POJO类检索数据时出错

Java 8 Java8-流特性在从3POJO类检索数据时出错,java-8,java-stream,Java 8,Java Stream,我为产品,属性和值开设了3个POJO课程。所有三个POJO都与其他POJO类有关系。现在,我想为 每一种产品 它与旧的方法配合得很好,但现在我想用新的Java8特性修改我的代码 请在下面找到我的代码 listProducts.stream().forEachOrdered(listproducts -> listproducts.getProductAttr() .stream().forEachOrdered(attr -> (((Collect

我为
产品
属性
开设了3个POJO课程。所有三个POJO都与其他POJO类有关系。现在,我想为 每一种产品

它与旧的方法配合得很好,但现在我想用新的Java8特性修改我的代码

请在下面找到我的代码

listProducts.stream().forEachOrdered(listproducts -> 
listproducts.getProductAttr()
                .stream().forEachOrdered(attr -> 
(((Collection<ProductAttrValue>) attr.getProductAttrValue()
                .stream().filter(attrlabel -> 
attrlabel.getLabel().equalsIgnoreCase("source"))))
                .stream().forEachOrdered(attrval ->
                                {
                                    System.out.println(attrval.getValue());
                                }
                            )       
                        )

            );
如果我没有执行类型转换
.stream().forEachOrdered(attr->)((Collection)attr.getProductAttrValue()
我会收到以下错误

请找到我的产品POJO类

public class Product {

    private String name;
    private long std_delivery_Time;
    private int min_order_Quantity;

    private String status;
    private long catalog_Id;
    private Date expiration_Date;
    private int rank;
    private String product_Type;
    private int is_Visible;
    private String product_Group;
       private String code;


    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public void setId(long id) {
        this.id = id;
    }

    public long getId() {
        return id;
    }

    public void setId(int id) {
          this.id = id;
         }


    public String getCode() {
      return code;
     }


    public void setCode(String code) {
      this.code = code;
     }

    @OneToMany( mappedBy = "product", cascade = CascadeType.ALL)
    private List<ProductAttr> productAttr;
    public List<ProductAttr> getProductAttr() {
        return productAttr;
    }

    public void setProductAttr(List<ProductAttr> productAttr) {
        this.productAttr = productAttr;
    }
 }

您的缩进表明了错误的心态。这些
stream()
操作不在同一级别。您有一个嵌套操作:

listProducts.stream().forEachOrdered(listproducts -> 
    listproducts.getProductAttr().stream().forEachOrdered(attr -> 
        attr.getProductAttrValue().stream()
                                  .filter(av -> av.getLabel().equalsIgnoreCase("source"))
                     /*.stream()*/.forEachOrdered(av -> System.out.println(av.getValue()))
    )
);
(我将具有误导性的名称
attrlabel
attrval
更改为
av
,因为它们不是标签或值;您随后对这些变量调用了
.getLabel()
.getValue()
,因此我对“
ProductAttrValue
”使用了
av

filter
操作是唯一不嵌套的操作,因为它是链接到流的中间操作,终端操作只需链接到结果流。在该位置不需要调用
stream()
(标记为
/*.stream()*/

也就是说,您应该避免这种嵌套操作

你可以用

listProducts.stream()
            .flatMap(listproducts -> listproducts.getProductAttr().stream())
            .flatMap(attr -> attr.getProductAttrValue().stream())
            .filter(av -> av.getLabel().equalsIgnoreCase("source"))
            .forEachOrdered(av -> System.out.println(av.getValue()));

相反。

所有流方法都返回另一个流。要转换回列表,需要使用收集器:

<your stream>.collect(Collectors.toList());
.collect(Collectors.toList());

(((集合)attr.getProductAttrValue()
为什么需要该强制转换?否则,我将在最后一个
.stream()上收到错误消息)
。请查找所附的屏幕截图。需要更多信息以提供帮助。
列表产品的内容是什么?
产品属性值的实现是什么?
?流不是集合。将流投射到集合不会神奇地使其成为集合。@Ishanthilinasomari-添加了所有3个pojo类。如何在此中添加多个过滤器
.filter()
以过滤
ProductAttr
s,或在第二个
flatMap(…)
之后过滤
ProductAttrValue
s,如前所述,但您可以插入更多内容。
listProducts.stream().forEachOrdered(listproducts -> 
    listproducts.getProductAttr().stream().forEachOrdered(attr -> 
        attr.getProductAttrValue().stream()
                                  .filter(av -> av.getLabel().equalsIgnoreCase("source"))
                     /*.stream()*/.forEachOrdered(av -> System.out.println(av.getValue()))
    )
);
listProducts.stream()
            .flatMap(listproducts -> listproducts.getProductAttr().stream())
            .flatMap(attr -> attr.getProductAttrValue().stream())
            .filter(av -> av.getLabel().equalsIgnoreCase("source"))
            .forEachOrdered(av -> System.out.println(av.getValue()));
<your stream>.collect(Collectors.toList());