【问题标题】:Only perform operation on exiting list using stream() and don't return any collection object仅使用 stream() 对退出列表执行操作,不返回任何集合对象
【发布时间】:2021-07-17 08:30:00
【问题描述】:

我正在尝试 Java 8 stream() API 来执行一些操作,但我无法实现所需的输出。

仅更新现有列表,我不想返回更新后的列表。请检查以下查询以及我正在尝试的相同内容。

  1. 我想将 id 分配给未分配 id 的学生,即该对象的 id 为 null 或空白。所以我只想执行这个操作,不想要任何回报,下面是我正在尝试的,但我不知道如何在不返回更新列表的情况下停止此操作。

    students.stream().filter(StringUtils.isNullOrBlank(s->s.getId())).map(e-> e.setId(randomNum++))
    
  2. 另一个是我想获取更新 id 的学生姓名列表。我正在尝试以下 2 种不同的操作,但我们可以一次完成吗?

    List<Student> studList = 
    employees.stream().filter(StringUtils.isNullOrBlank(s->s.getId())).map(e-> e.setId(randomNum++)).collect(Collectors.toList());
    List<String> names = studList.stream().map(s->s.getName()).collect(Collectors.toList());
    

【问题讨论】:

  • 如果你想更新现有的列表,那么stream 是错误的。但是看起来你并不想改变列表,你只是想在每个元素上调用一个方法,那为什么不使用forEach呢?

标签: java java-8


【解决方案1】:

如果您想使用Stream 并且您不关心收集结果,那么您可以使用终端操作,例如forEach()(非常类似于forEach method你可以在Collection 上找到,继承自Iterable):

students.stream()
    .filter(StringUtils.isNullOrBlank(s->s.getId()))
    .forEach(e-> e.setId(randomNum++));

但是,如果您想收集有关这些学生的信息,那么您可以使用 peek 获得副作用运行:

List<String> names = students.stream()
    .filter(StringUtils.isNullOrBlank(s->s.getId()))
    .peek(e-> e.setId(randomNum++))
    .map(Student::getName)
    .collect(Collectors.toList());

这将为每个没有 id 的学生设置一个 ID,并返回这些学生的姓名列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多