2017-04-26 9 views
-4

をしています:ストリームでラムダ操作を行う方法は?今の私としては、

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でストリームとラムダでこれを行う可能性のある効率的な方法はありますか?

+0

ラムダとストリーム?確かに – 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が答えを求めていることを祈っています:) – 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

関連する問題