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