使用java流替换复杂的代码

Using java stream to replace the complex code

我有下面的代码块,我正在尝试使用 java 流进行转换。

for(Emp emp:empList){
            if(combinedData.getOrg()==null){
                combinedData.setOrg(emp.getCompany());
            }
            combinedData.addToList(emp.getWorkLog());
            if(combinedData.getRawData()!=null){
                combinedData.setRawData(combinedData.getRawData()+emp.getData());
            }
            else{
                combinedData.setRawData(emp.getData());
            }
        }

我面临的挑战是我只需要设置一个 Org,而且我还需要附加到现有的原始数据。我知道这可以通过使用流减少行数来轻松完成。

完整代码如下

public class Main {
    public static void main(String[] args) {
        List<Emp> empList = Arrays.asList(
                new Emp("x1","as2112","a"),
                new Emp("x1","as2122","b"),
                new Emp("x1","as2422","c"),
                new Emp("x1","as2423","d"));
        CombinedData combinedData = new CombinedData();
        for(Emp emp:empList){
            if(combinedData.getOrg()==null){
                combinedData.setOrg(emp.getCompany());
            }
            combinedData.addToList(emp.getWorkLog());
            if(combinedData.getRawData()!=null){
                combinedData.setRawData(combinedData.getRawData()+emp.getData());
            }
            else{
                combinedData.setRawData(emp.getData());
            }
        }

}

}
class Emp{
    private String company;
    private String workLog;
    private String data;

    public Emp(
            String company,
            String workLog,
            String data) {
        this.company = company;
        this.workLog = workLog;
        this.data = data;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public String getWorkLog() {
        return workLog;
    }

    public void setWorkLog(String workLog) {
        this.workLog = workLog;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

class CombinedData{
    private String org;
    private List<String> worklogList;
    private String rawData;

    public String getOrg() {
        return org;
    }

    public void setOrg(String org) {
        this.org = org;
    }

    public List<String> getWorklogList() {
        return worklogList;
    }

    public void setWorklogList(List<String> worklogList) {
        this.worklogList = worklogList;
    }

    public String getRawData() {
        return rawData;
    }

    public void setRawData(String rawData) {
        this.rawData = rawData;
    }
    public void addToList(String worklog){
        this.worklogList.add(worklog);
    }
}

I know it can be easily done with reduced number of lines using streams.

嗯,这不是真的。我只能建议您将方法添加到 CombinedData

void add(Emp emp) {
    if(getOrg()==null){
        setOrg(emp.getCompany());
    }
    addToList(emp.getWorkLog());
    if(getRawData()!=null){
        setRawData(getRawData()+emp.getData());
    }
    else{
        setRawData(emp.getData());
    }
}

然后将其应用于流

CombinedData combinedData = new CombinedData();
empList.forEach(combinedData::add);

顺便说一句,此特定步骤作为 'combinedData':

的操作更好
if ( combinedData.getRawData() != null ) {
    combinedData.setRawData( combinedData.getRawData() + emp.getData() );
} else{
    combinedData.setRawData( emp.getData() );
}

combinedData.addRawData( emp.getData() );

可以说明的是,代码对 'combinedData' 进行了多次调用。调用者是否真的需要知道 'combinedData' 的状态,或者如何将现有原始数据与新原始数据组合(这里通过串联实现)?

(此外,如果您要添加同步/必须使此代码线程安全,以这种方式放置步骤效果会好得多。)