如何用流做lambda操作?

时间:2017-04-26 09:25:11

标签: java java-8 java-stream

至于现在我在做什么:

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());
        }
    }
}

在java8中使用Streams和lambda有什么有效的方法吗?

2 个答案:

答案 0 :(得分:1)

这是一个答案(不确定它是否正确),但几乎和你的问题一样模糊:

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()); 

答案 1 :(得分:0)

在您的情况下,我会写一个单独的方法来执行更新并将项目放在updatedItems集合中:

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-method才能将此引用(必须是最终的!)引用到此列表中。