我有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()
。