Java 8での作業に多少時間がかかりましたが、古いコードをリファクタリングしてストリーム操作を行うのが良いでしょう。古いコードは「機能する」が、私の目には本当に非効率的に見える。Java 8ストリーム:ストリーム・コレクション内の単一の項目を置き換えます。
私の質問の短いバージョンは、Listの1つの要素を見つけて、同じ要素の更新されたバージョンで置き換えようとしていることです(キーは同じですが、プロパティは毎回コードが呼び出されます)。
try
{
List<Object> items = lookup(itemCache.getKey());
for (int i = 0; i < items.size(); i++)
{
Object originalObject = items.get(i);
if (originalObject.getPropValue() == newObject.getPropValue())
{
List<Object> newItems = new ArrayList<>(items);
newItems.set(i, newObject);
putIntoCache(newObject.getKey(), newItems);
break;
}
}
}
catch (Exception ex) { /*exception handling*/ }
私は、これまでの流れについて読んだことに基づいて、私が私が確認したい要素を分離する.map()
または.filter()
を使用する必要があるようですが、それはまた、filter
かのどちらか後に発生した操作のように思えますmap
は、ストリームリスト内のすべての項目が.map()
の影響を受けるリストまたはリストでは動作しません。
シンプルだと思われますが、私はその頭を包み込むのに苦労しています。最初のルックアップはList
なので、私はストリームがこれをすべて置き換えることができると考えていました。 ArrayList<>()
は元のコードに表示されますが、そのアイテムをそのキーで置き換えることができる限り、アイテムの順序は重要ではありません。
お手数をおかけしますようお願い申し上げます。
ストリームはソースデータの_mutations_には適切ではありません。 – Savior
トピックはありませんが、キャッシュが 'Map'を実装している場合、' List'を読んでキャッシュに書き戻すのではなく、 'Map.computeIfPresent(UnaryOperator)'を調べるかもしれません。 'computeIfAbsent'はConcurrentHashMapのスレッドセーフです。これらの答えで取られたread-modify-writeアプローチとは異なります。 –