Не используйте опционально для проверки на ноль. Это не то, для чего это. Все, что вам нужно (если вы действительно хотите принять нулевой город), это
List<String> getSubjectNames(Town town) {
if (town == null) {
return Collections.emptyList();
}
return town.getSchool()
.getSubjects()
.stream()
.map(Subject::getName)
.collect(Collectors.toList());
}
Если бы у вас действительно был дополнительный город, вы бы сделали то же самое:
return optionalTown.map(town ->
town.getSchool()
.getSubjects()
.stream()
.map(Subject::getName)
.collect(Collectors.toList())
).orElse(Collections.emptyList());