Java 8流用于双循环,并在第一个循环中更改值



我已经嵌套了循环,并根据下面的条件更改了第一个列表。

它类似于cardNumber在firstList中相同或在secondList中找到,从secondList复制属性到firstList。

for (int i = 0; i < listFirst.size(); i++) {
for (int j = 0; j < listSecond.size(); j++) {
if (StringUtils.equals(listFirst.get(i).getCardNumber(), listSecond.get(j).getCardNumber())) {
try {
listFirst.get(i).setSubmitDate(listSecond.get(j).getIssueDate());
listFirst.get(i).setPersonalNumber(listSecond.get(j).getPersonalNumber());
listFirst.get(i).setMembershipPeriod(listSecond.get(j).getPeriod());
listFirst.get(i).setPhoneNumber(listSecond.get(j).getMobileNo());
listFirst.get(i).setIdCardNumber(listSecond.get(j).getIdNumber());
listFirst.get(i).setMoney(listSecond.get(j).getLoanAmount().toString());
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
}

我只是想知道这是可能在Java 8流?或者lambda表达式?我试过使用stream,但有时我很困惑。

假设Foo是你的类,我们可以将2个列表中的项形成笛卡尔积,然后通过某些属性(cardNumber相等)进行过滤。因此,匹配对可以用于forEach流终止方法。

listFirst.stream()
.flatMap(t -> listSecond.stream().map(s -> new Foo[] {t, s}))
.filter(pair -> StringUtils.equals(pair[0].getCardNumber(), pair[1].getCardNumber()))
.forEach(pair -> {
final Foo t = pair[0], s = pair[1]; // unpack pair
// set individual properties here (or call a setup method) ...
t.setSubmitDate(s.getIssueDate())
// .... more sets ...
}) 

稍微重组一下,是的:

如果您要在第一个列表中的类中添加一个方法来执行检查和赋值:

public void init(YourClass other) {
if (StringUtils.equals(getCardNumber(), other.getCardNumber())) {
try {
setSubmitDate(other.getIssueDate());
setPersonalNumber(other.getPersonalNumber());
setMembershipPeriod(other.getPeriod());
setPhoneNumber(other.getMobileNo());
setIdCardNumber(other.getIdNumber());
setMoney(other.getLoanAmount().toString());
} catch (Exception e) {
log.error(e.getMessage());
}
}
}

那么你的循环可以变成:

listFirst.stream()
.forEach(a -> listSecond.stream()
.forEach(b -> a.init(b)));

最新更新