使用流返回嵌套的for循环第一个元素



我有List<Item>,其中包含List<SubItem>对象,我需要返回SubItem的第一个日期。我想使用流。我知道SubItem从来不是null或空的。

背后的逻辑是从SubItem中检索日期,对于所有Item对象都是相同的。循环通过Item列表,然后循环通过SubItem(每个Item都有SubItem列表),从第一个SubItem返回日期开始。

使用非流

public LocalDate getSubItemDate(List<Item> items) {
LocalDate date = null;
for (Item item : items) {
List<SubItem> subItems = item.getSubItems().getSubItem();
for (SubItem si: subItems) {
XMLGregorianCalendar rawDate = si.getSubItemDate().getVal();
return rawDate.toGregorianCalendar().toZonedDateTime().toLocalDate();
}
}
return date;
}

使用流,我已经试过了,我想有这样的东西:

// but it's boolean...
public LocalDate getSubItemDate(List<Item> items) {
return items
.stream()
.anyMatch(item -> 
item.getSubItems().getSubItem()
.stream()
.anyMatch(si-> 
si.getSubItemDate().getVal().toGregorianCalendar().toZonedDateTime().toLocalDate()));

根据您的第一个代码片段,不需要为循环编写。您可以在检查列表大小后直接从列表中取出第一项。

if (items.size() > 0) {
Item item = items.get(0);
List<SubItem> subItems = item.getSubItems().getSubItem();
if (subItems.size() > 0) {
XMLGregorianCalendar rawDate = subItems.get(0).getSubItemDate().getVal();
return rawDate.toGregorianCalendar().toZonedDateTime().toLocalDate();
}
}
return null;

使用流,

items.stream()
.findFirst()
.flatMap(item -> item.getSubItems().getSubItem().stream().findFirst()
.map(si -> si.getSubItemDate().getVal().toGregorianCalendar().toZonedDateTime().toLocalDate()))
.orElse(null); //or use orElseThrow to throw an exception

另外,使用getSubItems().getSubItem()听起来很奇怪,应该只使用getSubItems()

最新更新