У нас есть метод, который получает объект класса в верхней части иерархии классов.Он использует условие, основанное на поле где-то глубже в иерархии, и если оно выполнено, то он использует для построителя другое поле также где-то глубже в иерархии, но по другому маршруту, начиная с высшего класса.
public Optional<SomeType> create(final TopClassInHierarchy topClass) {
Optional<SomeType> someObject = Optional.empty();
if (someCondition.evaluate(getFieldOne(topClass))) {
someObject = Optional.of(new SomeType.Builder()
.withFieldTwo(getFieldTwo(topClass))
.build());
}
return someObject;
private FieldOne getFieldOne(TopClassInHierarchy topClass) { return topClass.getSomething()...getFieldOne();
private FieldTwo getFieldTwo(TopClassInHierarchy topClass) { return topClass.getSomethingElse()...getFieldTwo();
Мы хотели бы предпочтительно сконцентрировать это в одном утверждении, что-то вроде этого
SomeType.Builder builder = new SomeType.Builder();
Optional.of(topClass)
.map(this::getFieldOne)
.filter(someCondition::evaluate)
.map(this::getFieldTwo) //???
.ifPresent(builder::withFieldTwo);
Однако, как только мы отобразим topClass на fieldOne для оценки состояния, впоследствии мы, похоже, не сможем"шаг назад" к topClass, чтобы сопоставить его с fieldTwo для строителя.Это возможно с одним утверждением?