2017-04-26 78 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