需要 java 流中的等效代码来迭代对象列表

Need a equivalent code in java streams for iterating list of Object

谁能帮我写出流等效代码 注意:- 我无法将 studentFinalList 设置为“final”

List<Student> studentFinalList=new ArrayList<>();
for (Student ep:StudentList) {
    if (StringUtils.isBlank(ep.getName()) && ep.getName() == null) {
        studentFinalList.add(ep);
    }
    else if (StringUtils.isNotBlank(ep.getName()) && 
        !ep.getName().equals("") && ep.getName() != null) {
        if (sIdList.contains(ep.getId())) {
            studentFinalList.add(ep);
        }
    }
}

您可以将所有 if 语句放在一个 filter:

List<Student> studentFinalList = studentList.stream()
        .filter(ep -> (StringUtils.isBlank(ep.getName()) && ep.ep.getName() == null) ||
                  (StringUtils.isNotBlank(ep.getName()) && !ep.getName().equals("") &&
                          ep.getName() != null && sIdList.contains(ep.getId())))
          .collect(Collectors.toList());

虽然我建议仔细检查您提交的代码,因为我怀疑它包含一些错误,例如 ep.ep.getName()

代码中的某些条件似乎是多余的,可以在不影响逻辑的情况下删除:

  • StringUtils.isBlank(ep.getName()) && ep.getName() == null 可能会缩短为 ep.getName() == null - 因为 StringUtils.isBlank 检查 null、空或纯空格字符串
  • StringUtils.isNotBlank(ep.getName()) && !ep.getName().equals("") && ep.getName() != null - 无需检查 !name.equals("")null,因此仅 StringUtils.isNotBlank(ep.getName()) 就足够了。

接下来,id列表sIdList应该被转换成集合,以便于查找id(集合中的O(1)而不是列表中的O(N))。

因此,代码可以简化为:

Set<String> sIdSet = new HashSet<>(sIdList);
List<Student> studentFinalList = studentList
    .stream()
    .filter(ep -> ep.getName() == null 
        || (!StringUtils.isBlank(ep.getName()) && sIdSet.contains(ep.getId()))
    )
    .collect(Collectors.toList());