如何使用流进行Lambda操作



现在我正在做:

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方法可以将此参考(必须是有效的最终!(。

最新更新