Злоупотребление Необязательной # картой, считающей отсутствующей Необязательный метод # peek - PullRequest
0 голосов
/ 05 июля 2018

Рассмотрим следующие классы:

ClassA {
}

ClassB {
    private ClassA classA;

    // getters and setters
}

Поскольку метод peek недоступен в Optional, считается ли это злоупотреблением методом Optional#map:

return myService.findA()
        .flatMap(a -> myService.findB(a) // also returns optional
                    .map(b -> {
                            b.setClassA(a);
                            return b;
                        }))
        .map(d -> MyType.of(d)) // MyType being other class
        .orElse(MyType.empty());

Это также можно записать так:

Optional<ClassA> optionalA = myService.findA();

if (optionalA.isPresent()) {
    Optional<ClassB> optionalB = myService.findB(optionalA.get());

    if (optionalB.isPresent()) {
        ClassB classB = optionalB.get();
        classB.setClassA(optionalA.get());
        return MyType.of(classB);
}
return MyType.empty();

Обе реализации выполняют одну и ту же логику, следует ли отдавать предпочтение одной над другой?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Мне кажется странным, что myService.findB(a) уже не подразумевает b.setClassA(a), так как оно имеет обе области действия, но в любом случае здесь нет необходимости злоупотреблять map:

return myService.findA()
    .flatMap(a -> {
        Optional<B> oB = myService.findB(a);
        oB.ifPresent(b -> b.setClassA(a));
        return oB;
    })
    .map(MyType::of).orElse(MyType.empty());
0 голосов
/ 06 июля 2018

Когда вы последовательно применяете принципы функционального проектирования, вы никогда не обновляете состояние на месте. Это подразумевает отсутствие каких-либо структур данных, позволяющих это (как в случае с ClassB с этим установщиком). Вы бы предпочли вернуть новый экземпляр этого класса с обновленными значениями. И если вы это сделаете, нет необходимости «злоупотреблять» либо map, либо flatMap, но вместо этого вы можете использовать замыкание:

return myService.findA()
    .flatMap(a -> myService.findB(a).map(b -> b.copyWith(a)))
    .map(MyType::of)
    .orElse(MyType.empty());
0 голосов
/ 05 июля 2018

Я, вероятно, предпочту перейти к первой реализации, поскольку основная функция, которую предлагает Optional при преобразовании, я предполагаю, что было бы лучше использовать ее с пользой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...