Java 8 – Streams嵌套ForEach与不同的Collection

我尝试理解新的Java 8 Streams,并且我尝试了几天将嵌套的foreach循环转移到Java 8 Streams中的集合上。

是否有可能重构以下嵌套的foreach循环,包括Java-8-Streams中的if-conditions?

如果是的话会是什么样子。

ArrayList Inq = new ArrayList(); TreeMap Quotations = new TreeMap(); ArrayList tempInqAndQuot = new ArrayList(); ArrayList tempQuotPos = new ArrayList(); for (ClassInq simInq : this.Inq){ if (!simInq.isClosed() && !simInq.isDenied()){ for (Map.Entry Quot: Quotations.entrySet()){ SalesQuot sapQuot = Quot.getValue(); if (sapQuot.getInquiryDocumentNumber().compareTo(simInq.getSapInquiryNumber()) == 0){ simInq.setSAPQuotationNumber(sapQuot.getQuotationDocumentNumber()); tempInqAndQuot.add(simInq); for (Map.Entry quotp : sapQuot.getPosition().entrySet()){ tempQuotPos.add(quotp.getValue()); } } } } } 

非常感谢你的帮助。

BR

首先,尝试遵循Java命名约定,因为大写的变量名称使得读取代码变得非常困难。 其次,您想要了解Stream API是一件好事,但您不应忽视Java 8 Collection API之前的基础知识。

当您只对键,键或值感兴趣时,迭代一个entrySet()是没有用的。 你在一小段代码中做了两次。

在第一次出现时你可以替换

 for (Map.Entry Quot: Quotations.entrySet()){ SalesQuot sapQuot = Quot.getValue(); 

更简单

 for (SalesQuot sapQuot: Quotations.values()){ 

在第二,整个

 for(Map.Entry quotp: sapQuot.getPosition().entrySet()){ tempQuotPos.add(quotp.getValue()); } 

可以替换为

 tempQuotPos.addAll(sapQuot.getPosition().values()); 

因此,即使没有流,您的代码也可以简化为

 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。 流forms将从更精确的定义中获益。