Использование потока Java для замены сложного кода - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть приведенный ниже блок кода, который я пытаюсь преобразовать с использованием потока 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());
            }
        }

Проблема, с которой я столкнулся, заключается в том, что мне нужно установить только одну организацию, а также мне нужно добавить к существующим rawdata. Я знаю, что это легко сделать с помощью уменьшенного числа строк с использованием потоков.

Полный код ниже

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

Ответы [ 2 ]

2 голосов
/ 22 апреля 2019

Я знаю, что это легко сделать с помощью уменьшенного числа строк с использованием потоков.

Ну, это не правда. Я только могу посоветовать вам добавить метод 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);
0 голосов
/ 22 апреля 2019

Кроме того, этот конкретный шаг лучше использовать в качестве операции 'комбинированных данных':

if ( combinedData.getRawData() != null ) {
    combinedData.setRawData( combinedData.getRawData() + emp.getData() );
} else{
    combinedData.setRawData( emp.getData() );
}

combinedData.addRawData( emp.getData() );

Что говорит о том, что в коде есть несколько вызовов «комбинированных данных». Нужно ли вызывающей стороне знать состояние «комбинированных данных» или как объединить существующие необработанные данные с новыми необработанными данными (реализованными здесь путем конкатенации)?

(Кроме того, размещение шага таким образом работает намного лучше, если вы когда-либо добавляете синхронизацию / должны были сделать этот поток кода безопасным.)

...