【问题标题】:Changing value of a field of an object inside an ArrayList using stream, making code more efficient使用流更改 ArrayList 内对象字段的值,使代码更高效
【发布时间】:2020-02-27 16:37:27
【问题描述】:

我在 ArrayList 里面有有限数量的对象。我想在列表中查看字段中的特定值,然后更改它。

我有以下实现。

String searchName = searchedName; //from outside we provide this
Person person = personList.stream()
        .filter(personList -> searchName.equals(personList.getName()))
        .findFirst()
        .orElse(null);
if (person != null){
    person.setName(replacement);
}

此代码有效,但流不是我的专长,我的问题是:我可以有相同的行为,但我不需要做额外的 if 吗?我觉得“如果”是额外的东西,我想让我的代码更有效率。

一个附带的问题是,如果我们有多个具有相同名称的条目,是否有一种方法可以使用流,所以我可以用什么来代替“.findFirst() .orElse(null)”将它存储在 person 对象中或可能的新对象数组。

【问题讨论】:

  • 如果您的列表很大,我建议您对该任务使用经典的 for/while 循环。或者您多次执行此操作。
  • 当然,最高效的方法是使用Map<String, Person>,但它可能没有什么不同,除非您的列表很大并且您正在进行大量查找。

标签: java object arraylist java-8 java-stream


【解决方案1】:

你可以使用Optional#isPresent来减少代码:

personList.stream()
          .filter(personList -> searchName.equals(personList.getName()))
          .findFirst()
          .ifPresent(person -> person.setName(replacement));

但如果我的目标是性能,流不会是我的第一选择。

如果你想处理所有满足谓词的对象:

personList.stream()
          .filter(personList -> searchName.equals(personList.getName()))
          .forEach(person -> person.setName(replacement));

【讨论】:

  • 你有一个很好的解决方案,但我得到一个错误。当我添加 person..setName 时,我在令牌“.”上出现语法错误,预期 ElidedSemicolonAndRightBrace 但只有一个“。”我得到类型不匹配:无法从 void 转换为 Person。好像有点奇怪
  • 错字:person..setName 应该只有 1 个点。 --- 复制/粘贴:两个代码块都有错字。
  • 只有 1 个点还有一个错误 Type mismatch: cannot convert from void to Person 并说它不能在封闭范围内重新声明另一个局部变量,不明白为什么
  • @BlajBogdan 注意到这个答案的解决方案没有 Person person = … 分配。使用此答案中编写的代码,除了两个点。
  • 已更正错字,非常感谢您的通知!
猜你喜欢
  • 2020-09-21
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多