用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并使用peekmap-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()