【问题标题】:Flipping a flag in a Collection [duplicate]在集合中翻转标志[重复]
【发布时间】:2020-01-21 04:54:38
【问题描述】:

我们有一份符合条件的学生名单 - List<Student>

Student {

    String name;
    ..........
    ..........
    Status status = Status.NONE;

}

我们需要将所有符合条件的学生的默认设置为STATUS.PASSED
Java 8 是否有比 for(student in students) 循环更好/更短的选项?

【问题讨论】:

  • for(Student s : students) 有什么问题,随便用。 Java8 没有提供更好的替代方案。
  • @Naman 等人。如果您找到该问题的良好副本,我完全赞成关闭该副本,但当前存在的副本根本无法解决该问题。问题中没有任何地方提到条件或过滤。
  • @RobbyCornelissen 同意你的观点,也没有将其标记为重复。
  • @RobbyCornelissen 我很遗憾错过了细节。谢谢你说出来。我希望更新的链接能解决当前的问题。

标签: java java-8


【解决方案1】:

对于更短的实现,您可以使用forEach()

students.forEach(s -> s.status = Status.PASSED);

对于更高性能的实现,传统的 for 循环可能会缩短几毫秒,具体取决于编译器/运行时优化:

for (int i = 0; i < students.size(); i++) {
    students.get(i).status = Status.PASSED;
}

【讨论】:

  • 有一个事件需要传递,然后才能将标志设置为Status.PASSED
  • @VishwaRatna 什么事件?该问题未提供任何事件的详细信息;它只是说“[a]在一个事件之后,我们需要设置......”。还是您的意思是条件而不是事件?还是争论?关于条件或参数的问题也没有任何内容......
  • 事件之后,我们需要将所有符合条件的学生的默认设置为 STATUS.PASSED 通过事件是解决方案的一部分,不是吗是吗?
  • @VishwaRatna "我们有一个符合条件的学生名单。活动结束后,我们需要设置所有个符合条件的学生的默认值..."
  • 我们有一个符合条件的学生名单 - 名单
【解决方案2】:

您可以为此使用forEach

students.forEach(s -> s.setStatus(STATUS.PASSED));

如果是有条件的,那么:

students.stream()
    .filter(s -> hasPassed(s))
    .forEach(s -> s.setStatus(STATUS.PASSED));

甚至更短:

students.forEach(s -> s.setStatus(hasPassed(s) ? STATUS.PASSED : Status.NONE));

【讨论】:

    猜你喜欢
    • 2018-08-12
    • 2016-12-26
    • 2020-04-23
    • 2012-02-18
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多