现在我正在做:
Map<Integer, Item> itemList = getItems(input);
Iterator<Item> ItemIterator = input.getItems().iterator();
List<Item> updatedItems = Lists.newLinkedList();
for (int i = MIN; i <= input.getInputReq().getList().size(); i++) {
Item item = itemList.get(i);
if (item != null) {
item.setFlag(false);
item.setId(getId());
updatedItems.add(item);
itemList.remove(i);
} else {
if (ItemIterator.hasNext()) {
updatedItems.add(ItemIterator.next());
}
}
}
我有什么有效的方法可以用streams和java8中的lambda做到这一点?
这个答案(不确定它是正确的(,但几乎和您的问题一样晦涩:
int size = input.getInputReq().getList();
List<Item> updatedItems = IntStream.range(0, size)
.mapToObj(i -> itemList.get(i) )
.map(e ->
{
return Optional.of(e).map(i -> {
i.setFlag(false);
i.setId(getId());
return i;
}).orElse(ItemIterator.next());
}).collect(Collectors.toList());
i在您的情况下会编写一个单独的方法,该方法可以进行更新,并将项目放在更新中的收集中:
private void updateItemsAndPutThemInList(Item item){
item.setFlag(false);
setId(getId());
updatedItems.add(item);
}
然后使用以下代码处理它们:
input.getItems().stream().filter(i -> i != null).forEach(i -> updateItemsAndPutThemInList(i));
根据您的代码目的,您可以指定必须将更新的项目作为私人方法的参数中的列表,其签名将是:
private void updateItemsAndPutThemInList(Item item, List<Item> updatedItems)
,并且要求foreach方法可以将此参考(必须是有效的最终!(。