Update
Чтобы добавить альтернативу, вот что код будет выглядеть, чтобы сделать работу с двумя filter()
операций. Обратите внимание, что это влияет на повторение итерации всей коллекции во второй раз, что может повлиять на производительность, если это большая коллекция.
Я также пошел вперед и упростил некоторые из логики в отношении соединения строк. Поправьте меня, если я там что-то пропустил.
final List<String> courseIdList = new ArrayList<>();
final List<String> pastCourseIdList = new ArrayList<>();
equivalentCourses.stream().filter((current) -> current.getNcourse() != null)
.forEach((current) -> courseIdList.add(current.getNcourse().getId()));
equivalentCourses.stream().filter((current) -> current.getNcourse() != null && current.getPastCourse() != null)
.forEach((current) -> pastCourseIdList.add(current.getPastCourse().getId()));
String ncourseIds = String.join(",", courseIdList);
String pastCourseIds = String.join(",", pastCourseIdList);
Оригинальный ответ
Для вашего случая использования, это может сделать больше смысла использовать forEach()
лямбда. Это будет самый простой способ сделать перевод.
java.lang.Character cha = new java.lang.Character(',');
final StringBuilder ncourseIdBuilder = new StringBuilder();
final StringBuilder pastCourseIdBuilder = new StringBuilder();
equivalentCourses.stream().forEach((equivalentCourse) -> {
if (equivalentCourse.getNcourse() != null) {
ncourseIdBuilder.append(equivalentCourse.getNcourse().getId()).append(",");
} else if (equivalentCourse.getPastCourse() != null) {
pastCourseIdBuilder.append(equivalentCourse.getPastCourse().getId()).append(",");
}
});
String ncourseIds = ncourseIdBuilder.toString();
String pastCourseIds = pastCourseIdBuilder.toString();
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);
}
Вы можете переписать код, используя filter()
выражения, но это будет требовать большую переделку логики в условных, которая вводит риск вы можете сломать что-то, если это не тестируется. Логические изменения - это именно то, что @Holger и @Ole V.V. в своих комментариях к исходному вопросу.
Независимо от того, используете ли вы forEach()
или фильтры, lambdas не может получить доступ к не конечным переменным внутри выражения, поэтому я добавил переменную final StringBuilder
за пределы области действия цикла.
Почему вы используете 'Character' вместо' char'? Это делает ваш код труднее читать * и * тратит ресурсы. Хотя вам это совсем не нужно, если вы замените '! NcourseIds.isEmpty() && ha.equals (ncourseIds.charAt (ncourseIds.length() - 1))' с помощью простого 'ncourseIds.endsWith (", ")' и аналогично: '! pastCourseIds.isEmpty() && cha.equals (pastCourseIds.charAt (pastCourseIds.length() - 1))' с 'pastCourseIds.endsWith (", ")'. Чтобы собрать две строки с потоками, вы можете просто выполнить две потоковые операции. – Holger
@ Хольгер уже сказал это: используйте две операции потока (один для 'getNcourse()! = Null' и один для' getNcourse() == null && getPastCourse()! = Null'). –