在 java-8 lambda 表达式中使用 if-else 语句

Sha*_*aee 5 java lambda if-statement java-8

我在 java-7 中有一个 for 语句,它工作正常:

Character cha = new Character(',');
String ncourseIds = null;
String pastCourseIds = null;
for (EquivalentCourse equivalentCourse : equivalentCourses) {
  if(equivalentCourse.getNcourse() != null){
    ncourseIds += equivalentCourse.getNcourse().getId()+ ",";   
  } else if(equivalentCourse.getPastCourse() != null) {
    pastCourseIds +=equivalentCourse.getPastCourse().getId()+","; 
  }
}
if(!ncourseIds.isEmpty() &&cha.equals(ncourseIds.charAt(ncourseIds.length()-1))) {
  ncourseIds = ncourseIds.substring(0, ncourseIds.length()-1);
}
if(!pastCourseIds.isEmpty()&& cha.equals(pastCourseIds.charAt(pastCourseIds.length()-1))) {
  pastCourseIds = pastCourseIds.substring(0,pastCourseIds.length()-1);
}
Run Code Online (Sandbox Code Playgroud)

现在我想将我的代码转换为Stream&collect在 java-8 中,我实现了一半关于 filter not null 的业务Ncourse

equivalentCourses.stream().filter(obj -> obj.getNcourse() != null )
                 .map(obj -> obj.getNcourse().getId()).collect(Collectors.joining(",")); 
Run Code Online (Sandbox Code Playgroud)

但我不知道实施它的else-statement. 有什么帮助吗?

Joo*_*gen 6

由于流调用链很复杂,所以创建两个流 - 避免条件分支。

String ncourseIds = equivalentCourses.stream()
   .filter(equivalentCourse -> equivalentCourse.getNcourse() != null)
   .map(EquivalentCourse::getNcourse)
   .map(x -> String.valueOf(x.getId()))
   .collect(Collectors.joining(", "));

String pastCourseIds = equivalentCourses.stream()
   .filter(equivalentCourse -> equivalentCourse.getNcourse() == null
          && equivalentCourse.getPastCourse() != null)
   .map(EquivalentCourse::getPastCourse)
   .map(x -> String.valueOf(x.getId()))
   .collect(Collectors.joining(", "));
Run Code Online (Sandbox Code Playgroud)

这也是专注于生成的两个字符串的代码,具有高效的连接。

顺便说一句,如果这是用于 SQL 字符串,您可以将 PreparedStatement 与Array一起使用。


@Holger 评论的装饰:

String ncourseIds = equivalentCourses.stream()
   .map(EquivalentCourse::getNcourse)
   .filter(Objects::nonNull)
   .map(NCourse::getId)
   .map(String::valueOf)
   .collect(Collectors.joining(", "));

String pastCourseIds = equivalentCourses.stream()
   .filter(equivalentCourse -> equivalentCourse.getNcourse() == null)
   .map(EquivalentCourse::getPastCourse)
   .filter(Objects::nonNull)
   .map(EquivalentCourse::getPastCourse)
   .map(PastCourse::getId)
   .map(String::valueOf)
   .collect(Collectors.joining(", "));
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过更改顺序来简化。第一个流操作:`.map(EquivalentCourse::getNcourse) .filter(Objects::nonNull)`,第二个流操作:`.filter(equivalentCourse -> equivalentCourse.getNcourse() == null) .map(EquivalentCourse::getPastCourse ) .filter(Objects::nonNull)`。 (2认同)