在条件为空的情况下从Java流中过滤值

时间:2019-06-28 21:24:34

标签: java java-stream

如果值满足特定条件或某个值为空,我将尝试从流中获取值:

for (ProjectTask task : tasks) {
   TaskEnrollmentUpdateRequest updateTask = updatedPhase.getTasks().stream()
        .filter(t -> task.getId().equals(t.getId()) || t.getId() == null).findFirst().get();
    if (updateTask != null) {
      if (updateTask.getId() != null) {
        mapper.map(updateTask, task);
      } else {
        TaskEnrollmentUpdateRequest ted = updateTask;
      }
    }
...
}

想法是,如果task数组中已经存在updateTask,即它的id值存在于对象中,则我将用updateTask中的值更新tasks。该数组。如果id为null,这将是一个新任务,那么我想创建一个新任务以添加到tasks数组中。问题是我的过滤器函数正在过滤出所有具有空ID的值,因此我永远无法将它们添加到tasks数组中。

这是如上所述过滤出值的正确函数吗?

t -> task.getId().equals(t.getId()) || t.getId() == null

2 个答案:

答案 0 :(得分:1)

按照@JBNizet所说,我想你想要这样的东西:

for (ProjectTask task : tasks) {
    Optional<TaskEnrollmentUpdateRequest> updateTaskOptional = updatedPhase.getTasks().stream()
            .filter(t -> task.getId().equals(t.getId()) || t.getId() == null).findFirst();
    if (updateTaskOptional.isPresent()) {
        TaskEnrollmentUpdateRequest updateTask = updateTaskOptional.get();
        if (updateTask.getId() != null) {
            ...
        } else {
            ...
        }
    }
}

如果过滤器导致列表为空,则.findFirst()将返回一个空的Optional,并且对其调用.get()将引发异常,因为它没有值。因此,您必须专门检查这种情况,方法是检查Optional返回的.findFirst()是否包含一个值,而不是假设它总是会存在。

答案 1 :(得分:1)

您可以尝试以下方法:

tasks.stream()
        .flatMap(task -> updatedPhase.getTasks().stream().map(ut -> Map.entry(task, ut)))
        .filter(e -> e.getValue().getId() == null || e.getKey().getId().equals(e.getValue().getId()))
        .findFirst().ifPresent(e -> {
            if (e.getValue().getId() != null) {
                mapper.map(e.getValue(), e.getKey());
            } else {
                TaskEnrollmentUpdateRequest ted = e.getValue();
            }
        });