Существующий способ сопоставления Java Необязательно <> на объект вместо другого объекта? - PullRequest
0 голосов
/ 14 декабря 2018

Я знаком с Optional.map(mapper), который сопоставляет необязательный объект с чем-то другим.Поэтому, если бы я хотел что-то сделать с необязательным Foo и необязательным Bar, я мог бы сделать:

Optional<Foo> foobar = foo.map(foo -> foo.addBar(bar))

Это работает примерно так:

Optional<Foo> foobar = foo.isPresent() ? Optional.of(foo.get().add(bar)) : Optional.empty();

Но я вижу повторяющийся шаблон, в котором bar является необязательным.Функциональность, которую я хочу воспроизвести, выглядит примерно так:

Foo foobar = bar.isPresent() ? foo.add(bar.get()) : foo;

Другими словами, если присутствует другая вещь, позвольте мне сделать с ней что-то в отношении моей существующей вещи;в противном случае, просто верните мне мою существующую вещь.

Я мог бы представить, как сделать свою собственную Optionals.doIfOtherPresent(T object, Optional<U> optional, BiFunction<? super T, ? super U, ? extends T> fn).Я бы использовал это так:

Foo foobar = doIfOtherPresent(foo, bar, foo::add);

Есть ли что-то в библиотеке Java, которая уже делает это?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Учитывая приведенный вами пример, кажется, что вы хотите применить операцию foo.add, если присутствует bar, в противном случае вернуть foo:

Foo foobar = bar.isPresent() ? foo.add(bar.get()) : foo;

Таким образом, я бы сказал,оно настолько короткое, что не стоит создавать для него служебный метод.

Foo foobar = optBar.map(f::add).orElse(f); // map to Foo if bar is present else return `f`
  • , если optBar имеет текущее состояние, мы применяем операцию map и orElse возвращает сопоставленныйзначение.
  • , если optBar имеет отсутствующее состояние, метод orElse возвращает предоставленное значение по умолчанию f.

Другое дело, вы получаетерезультат как Optional<Bar> на первом месте или вы вручную оборачиваете Bar в дополнительный?если бы он был последним, я бы просто использовал простое выражение if, которое было бы идеальным решением, то есть

Foo foo = new Foo();
if(bar != null) foo = foo.add(bar);
0 голосов
/ 15 декабря 2018

Я думаю, что другие ответы, начинающиеся с Optional<Bar>, отлично подходят для многих ситуаций.Если вам нужно foo.addBar условно в более длинной цепочке методов, включающей Foo на каком-то этапе, подход также можно использовать там (еще не проверено):

    Optional<Foo> foobar = foo.map(foo -> bar.map(bar -> foo.addBar(bar)));
0 голосов
/ 14 декабря 2018

Использование bar вместо foo, кажется, упрощает это:

Foo foobar = bar
         .map(b -> foo.map(f -> f.add(b)))
         .orElse(foo)
         .orElse(null); // if foo is not present

bar.map(b -> foo.map(f -> f.add(b))) возвращает Optional<Optional<Foo>>, что «присутствует», если присутствует bar.

.orElse(foo) возвращается к исходному Optional<Foo>, если bar отсутствует (или возвращает foo.map(f -> f.add(b)) в противном случае).

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