加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在java 8中使用reduce对列表进行排序?

发布时间:2020-12-15 02:11:04 所属栏目:Java 来源:网络整理
导读:我有对象列表List BoM在BoM中我有一个List BoMLine,现在我必须使用reduce对BoMine属性中的一个进行BoM列表排序,并在方法中返回一个已排序的List, public static ListBoM sortBoms() { ListBoM sortedBomList = new ArrayList(); BoM bomn = new BoM(); sorte
我有对象列表List< BoM>在BoM中我有一个List< BoMLine>,现在我必须使用reduce对BoMine属性中的一个进行BoM列表排序,并在方法中返回一个已排序的List,

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是BoM的列表,sortBoM方法:

private static BoM sortBoM(BoM bom1,BoM bom2) {
    bom2.getLine().stream()
            .sorted((l1,l2) -> l1.getLineNum().compareTo(l2.getLineNum()));
    bom1 = bom2;
    return bom1;
}

BoM课程:

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

和BoMLine类:

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 + "]";
}}

我必须通过BoMLine lineNum订购BoM列表.
但它只返回bomList.Any帮助的一个对象?

解决方法

您可以使用Comparator.comparing创建自定义Comparator,按行号的升序对每个BoMLine进行排序:

List<BoM> sortedBomList = new ArrayList<>();
sortedBomList.forEach(bom -> bom.getLine().sort(comparing(BoMLine::getLineNum)));

请注意,这将改变List< BoMLine>和列表< BoM>这可能不是一个好主意.

更好的方法是获取不变性并创建一个构造函数来获取bom代码和bom行列表:

List<BoM> sortedBomList = 
        bomList.stream()
               .map(bom -> new BoM(
                               bom.BomCode,bom.getLine().stream()
                                            .sorted(comparing(BoMLine::getLineNum))
                                            .collect(toList())
                           )
               )
               .collect(toList());

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读