Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8-具有不同集合的嵌套ForEach流_Java_Collections_Foreach_Java 8_Java Stream - Fatal编程技术网

Java8-具有不同集合的嵌套ForEach流

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

我试图理解新的Java8流,并且花了好几天的时间在Java8流中的集合上传输嵌套的foreach循环

是否可以重构以下嵌套的foreach循环,包括Java-8-Streams中的if条件

如果是,它会是什么样子

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