我在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);
}
现在我想把我的代码转换成java-8中的Stream&collect,我实现了关于filter not null的一半业务:
equivalentCourses.stream().filter(obj -> obj.getNcourse() != null )
.map(obj -> obj.getNcourse().getId()).collect(Collectors.joining(","));
但我不知道如何实现它。有什么帮助吗?
最佳答案:
由于流调用链是复杂的,所以要生成两个流—避免条件分支。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(", "));
这也是代码关注的结果是两个字符串,有一个有效的连接。
顺便说一下,如果这是针对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(", "));