gpt4 book ai didi

Java 8 - 使用不同集合嵌套 ForEach 的流

转载 作者:行者123 更新时间:2023-12-02 11:17:32 38 4
gpt4 key购买 nike

我尝试了解新的 Java 8 Streams,并尝试了几天来在 Java 8 Streams 中通过集合传输嵌套的 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());
}
}
}
}
}

非常感谢您的帮助。

BR

最佳答案

首先,尝试遵守 Java 命名约定,因为大写变量名会使代码难以阅读。其次,您想了解 Stream API 是一件好事,但您不应该忽视 Java 8 之前的 Collection API 的基础知识。

当您只对键或值感兴趣时,迭代 entrySet() 是没有用的。您可以在一小段代码中执行两次。

第一次出现时你可以替换

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

比较简单

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

第二个,整个

for(Map.Entry<String,SalesQuotPosition> 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。流形式将极大地受益于对要实现的目标的更精确的定义。

关于Java 8 - 使用不同集合嵌套 ForEach 的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25357043/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com