如何解决用ifPresent和orElse替换isPresent
我的方法中有以下逻辑,其中我检查可选参数的值,并以此为基础构建另一个对象。
atomicreference<Employee> employeeValue = null;
questions.forEach(question -> {
if(question.isBoolean().isPresent()) {
employeeValue.set(Employee.builder()
.withBooleanValue(Boolean.valueOf(question.value()))
.build());
} else {
employeeValue.set(Employee.builder()
.withStringValue(question.value())
.build());
}
Record record = Record.builder()
.withId(question.id())
.withValue(employeeValue.get())
.build();
answers.add(record);
});
如何用ifPresent和orElse替换以上内容?我正在使用Java 8,因此ifPresentOrElse方法不可用。如果我要分别使用ifPresent和orElse和匿名内部函数,该如何处理?
任何帮助将不胜感激。
解决方法
您可以流经questions
并使用peek
和map
-orElse
的构造来获得相同的结果:
questions.stream()
.peek(question -> {
Employee employee = question.isBoolean()
.map(b -> Employee.builder().withBooleanValue(Boolean.valueOf(question.value())).build())
.orElse(Employee.builder().withStringValue(question.value()).build());
employeeValue.set(employee);
}
)
.map(question -> Record.builder().withId(question.id()).withValue(employeeValue.get()).build())
.forEach(answers.add(answer)); // did you mean 'record'?
但是,老实说,它并没有太大变化-您的实现看起来可能不那么“ java 80”,但是很好:)
,您既不需要isPresent()
也不需要ifPresent()
。您不需要peek()
(如其他答案)或AtomicReference
(如问题)。我相信这样做:
questions.forEach(question -> {
Employee empl = question.isBoolean()
.map(b -> Employee.builder()
.withBooleanValue(Boolean.valueOf(question.value()))
.build())
.orElseGet(() -> Employee.builder()
.withStringValue(question.value())
.build());
Record record = Record.builder()
.withId(question.id())
.withValue(empl)
.build();
answers.add(record);
});
如果需要,您可能可以在其他答案中将此想法应用到信息流中。我宁愿不使用Stream.forEach()
,也不愿使用列表收集到列表中,然后使用answers.addAll()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。