Java8-具有不同集合的嵌套ForEach流
我试图理解新的Java8流,并且花了好几天的时间在Java8流中的集合上传输嵌套的foreach循环 是否可以重构以下嵌套的foreach循环,包括Java-8-Streams中的if条件 如果是,它会是什么样子Java8-具有不同集合的嵌套ForEach流,java,collections,foreach,java-8,java-stream,Java,Collections,Foreach,Java 8,Java Stream,我试图理解新的Java8流,并且花了好几天的时间在Java8流中的集合上传输嵌套的foreach循环 是否可以重构以下嵌套的foreach循环,包括Java-8-Streams中的if条件 如果是,它会是什么样子 ArrayList<ClassInq> Inq = new ArrayList<>(); TreeMap<String, SalesQuot> Quotations = new TreeMap<>(); ArrayList<Cla
ArrayList<ClassInq> Inq = new ArrayList<>();
TreeMap<String, SalesQuot> Quotations = new TreeMap<>();
ArrayList<ClassInq> tempInqAndQuot = new ArrayList<>();
ArrayList<SalesQuot> tempQuotPos = new ArrayList<>();
for(ClassInq simInq : this.Inq) {
if(!simInq.isClosed() && !simInq.isDenied()) {
for(Map.Entry<String, SalesQuot> Quot: Quotations.entrySet()) {
SalesQuot sapQuot = Quot.getValue();
if(sapQuot.getInquiryDocumentNumber().compareTo(simInq.getSapInquiryNumber()) == 0) {
simInq.setSAPQuotationNumber(sapQuot.getQuotationDocumentNumber());
tempInqAndQuot.add(simInq);
for(Map.Entry<String, SalesQuotPosition> quotp : sapQuot.getPosition().entrySet()) {
tempQuotPos.add(quotp.getValue());
}
}
}
}
}
ArrayList Inq=new ArrayList();
TreeMap quotes=新的TreeMap();
ArrayList tempInqAndQuot=新的ArrayList();
ArrayList tempQuotPos=新的ArrayList();
for(ClassInq-simInq:this.Inq){
如果(!simInq.isClosed()&&!simInq.isDenied()){
对于(Map.Entry Quot:quotes.entrySet()){
SalesQuot sapQuot=Quot.getValue();
if(sapQuot.getInquirryDocumentNumber().compareTo(simInq.getSapInquirryNumber())==0){
simInq.setSAPQuotationNumber(sapQuot.getQuotationDocumentNumber());
tempInqAndQuot.add(simInq);
对于(Map.Entry quotp:sapQuot.getPosition().entrySet()){
tempQuotPos.add(quotp.getValue());
}
}
}
}
}
非常感谢你的帮助
BR首先,尝试遵守Java命名约定,因为大写变量名使代码很难阅读。其次,您希望了解
Stream
API是一件好事,但不应忽略前java8集合
API的基础知识
当您只对键或值感兴趣时,迭代entrySet()
是没有用的。在一小段代码中执行两次
第一次出现时,您可以替换
for (Map.Entry<String, SalesQuot> Quot: Quotations.entrySet()){
SalesQuot sapQuot = Quot.getValue();
第二,整个
for(Map.Entry<String,SalesQuotPosition> quotp: sapQuot.getPosition().entrySet()){
tempQuotPos.add(quotp.getValue());
}
因此,即使没有流,您的代码也可以简化为
for (ClassInq simInq : this.Inq){
if (!simInq.isClosed() && !simInq.isDenied()){
for (SalesQuot sapQuot: Quotations.values()){
if (sapQuot.getInquiryDocumentNumber().compareTo(simInq.getSapInquiryNumber()) == 0){
simInq.setSAPQuotationNumber(sapQuot.getQuotationDocumentNumber());
tempInqAndQuot.add(simInq);
tempQuotPos.addAll(sapQuot.getPosition().values());
}
}
}
}
虽然现在还不清楚它应该做什么,是否正确。除了问题注释中提到的错误和怀疑之外,修改传入值(特别是来自外部循环)看起来并不正确
还不清楚为什么要使用…compareTo(…)==0
而不是equals
但是,它可以直接重写以使用流,而不改变任何代码逻辑:
this.Inq.stream().filter(simInq -> !simInq.isClosed() && !simInq.isDenied())
.forEach(simInq -> Quotations.values().stream().filter(sapQuot ->
sapQuot.getInquiryDocumentNumber().compareTo(simInq.getSapInquiryNumber())==0)
.forEach(sapQuot -> {
simInq.setSAPQuotationNumber(sapQuot.getQuotationDocumentNumber());
tempInqAndQuot.add(simInq);
tempQuotPos.addAll(sapQuot.getPosition().values());
})
);
尽管如此,我还是建议先清理原始逻辑,然后再为使用其他API重写它。流表单将从更精确的定义中受益匪浅。您确定此代码正确吗?由于在内部循环中调用了
tempinqand.add(simInq)
,您多次将同一对象添加到同一集合中。是否应将tempQuotPos
定义为ArrayList
?您好,这是事实,ArrayList必须来自SalesquotPosition类型谢谢您的帮助。我是一名java初学者,我尝试先让程序工作,然后在下一步改进/重构它。谢谢你的提示。因此,首先我将清理java命名约定问题,然后我将尝试清理我的代码。
for (ClassInq simInq : this.Inq){
if (!simInq.isClosed() && !simInq.isDenied()){
for (SalesQuot sapQuot: Quotations.values()){
if (sapQuot.getInquiryDocumentNumber().compareTo(simInq.getSapInquiryNumber()) == 0){
simInq.setSAPQuotationNumber(sapQuot.getQuotationDocumentNumber());
tempInqAndQuot.add(simInq);
tempQuotPos.addAll(sapQuot.getPosition().values());
}
}
}
}
this.Inq.stream().filter(simInq -> !simInq.isClosed() && !simInq.isDenied())
.forEach(simInq -> Quotations.values().stream().filter(sapQuot ->
sapQuot.getInquiryDocumentNumber().compareTo(simInq.getSapInquiryNumber())==0)
.forEach(sapQuot -> {
simInq.setSAPQuotationNumber(sapQuot.getQuotationDocumentNumber());
tempInqAndQuot.add(simInq);
tempQuotPos.addAll(sapQuot.getPosition().values());
})
);