【发布时间】:2016-04-18 21:32:20
【问题描述】:
我对使用 Java 8 有点陌生,我正在重构一些旧代码(这似乎是一个很好的用例)流操作。旧代码“有效”,但在我看来,它看起来效率非常低。
我的问题的简短版本是我正在尝试查找 List 的单个元素并将其替换为同一元素的更新版本(键是相同的,但每次代码时属性都有不同的值被调用)。
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() 来隔离我想要识别的元素,但这似乎也是在@987654324 之后发生的操作流语句中的@ 或map 将在不是完整列表或每个项目都受.map() 影响的列表上运行。
这似乎很简单,但我正在努力解决它。因为最初的查找是 List 本身,所以我认为流可以替换所有这些。 ArrayList<>() 出现在原始代码中,但项目的顺序并不重要,只要我能够用它的键替换该项目。
如果您选择提供帮助,谢谢。
【问题讨论】:
-
流不适合源数据的mutations。
-
题外话,但如果您的缓存实现了
Map,您可能会查看Map.computeIfPresent(UnaryOperator<T>),而不是读取List并将其写回缓存。computeIfAbsent在 ConcurrentHashMap 中是线程安全的,这与这些答案中采用的读-修改-写方法不同。
标签: java java-stream