How to use reduce to sort lists in Java 8?
•
Java
I have an object list list < BOM > in BOM, I have a list < bomline >, and now I have to use reduce pair Bo@R_403_2177 @Property to sort the BOM list and return a sorted list in the method,
public static List<BoM> sortBoms() {
List<BoM> sortedBomList = new ArrayList<>();
BoM bomn = new BoM();
sortedBomList.add(bomList.parallelStream().reduce(bomn,(bom1,bom2) -> sortBoM(bom1,bom2)));
System.out.println(sortedBomList.size());
return sortedBomList;
}
Bomlist is the list of BOM. Sortbom method:
private static BoM sortBoM(BoM bom1,BoM bom2) {
bom2.getLine().stream()
.sorted((l1,l2) -> l1.getLineNum().compareTo(l2.getLineNum()));
bom1 = bom2;
return bom1;
}
BOM course:
public class BoM implements Domain {
private String BomCode;
private List<BoMLine> line = new ArrayList<BoMLine>();
public String getBomCode() {
return BomCode;
}
public void setBomCode(String bomCode) {
BomCode = bomCode;
}
public List<BoMLine> getLine() {
return line;
}
public void setLine(List<BoMLine> line) {
this.line = line;
}
public void addLine(BoMLine bomLine) {
bomLine.setbOM(this);
line.add(bomLine);
}}
And bomline classes:
public class BoMLine implements Domain {
private Long lineNum;
private String material;
private BigDecimal Qty;
private BoM bOM;
public Long getLineNum() {
return lineNum;
}
public void setLineNum(Long lineNum) {
this.lineNum = lineNum;
}
public String getMaterial() {
return material;
}
public void setMaterial(String material) {
this.material = material;
}
public BigDecimal getQty() {
return Qty;
}
public void setQty(BigDecimal qty) {
Qty = qty;
}
public BoM getbOM() {
return bOM;
}
public void setbOM(BoM bOM) {
this.bOM = bOM;
}
public String getBoMCode() {
return bOM.getBomCode();
}
@Override
public String toString() {
return "BoMLine [ bOM=" + bOM.getBomCode() + ",lineNum=" + lineNum
+ ",material=" + material + ",Qty=" + Qty + "]";
}}
I have to order the BOM list through bomline linenum But it only returns Bomlist An object of any help?
Solution
You can use comparator Comparing creates a custom comparator and sorts each bomline in ascending order of line number:
List<BoM> sortedBomList = new ArrayList<>(); sortedBomList.forEach(bom -> bom.getLine().sort(comparing(BoMLine::getLineNum)));
Please note that this will change list < bomline > and list < BOM >, which may not be a good idea
A better way is to get invariance and create a constructor to get BOM code and BOM line list:
List<BoM> sortedBomList =
bomList.stream()
.map(bom -> new BoM(
bom.BomCode,bom.getLine().stream()
.sorted(comparing(BoMLine::getLineNum))
.collect(toList())
)
)
.collect(toList());
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码
