2017-04-26 46 views
-4

至于现在我做:如何使用流进行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()); 
     } 
    } 
} 

有什么有效的方法,我可以在java8与流和lambda做到这一点?

+0

与lambda和流?确定 – freedev

+3

您正在以多种方式访问​​“输入”的未知内容,对于不了解上下文的人来说,(几乎)不可能帮助您找到一个简洁的解决方案。 –

+0

@RobinTopper对不起,我的问题不清楚。输入是一个对象与标志(布尔)和Id(字符串) – user3407267

回答

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

希望upvote是答案incipit :) – freedev

+0

问题是我需要跟踪2个数字。我的列表从0开始,但我的地图从1开始。 – user3407267

+0

@ user3407267是否已修复? – freedev

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-方法来获得这个参考(它必须是有效的最终!)到这个列表。

+0

但问题是我需要跟踪2个整数。 1 - 列表索引和2 - 分钟1到大小 – user3407267