使用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' 的状态,或者如何将现有原始数据与新原始数据组合(这里通过串联实现)?
(此外,如果您要添加同步/必须使此代码线程安全,以这种方式放置步骤效果会好得多。)
我有下面的代码块,我正在尝试使用 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' 的状态,或者如何将现有原始数据与新原始数据组合(这里通过串联实现)?
(此外,如果您要添加同步/必须使此代码线程安全,以这种方式放置步骤效果会好得多。)