Java BinaryOperator и фабричный метод. Как вернуть первый параметр?

Я пытался преобразовать свой поток в карту с помощью следующего кода:

Collectors.toMap(City::key, Function.identity(), (first, second) -> first)

Мой вопрос по поводу последней лямбды.

(first, second) -> first

Мне часто нужно получить элемент любой или всегда элемент первый, если происходит столкновение. Я понимаю, что это уже краткая и понятная форма. Но все равно. Для класса Function у нас есть фабричный метод Function.identity(), который возвращает переданный параметр как есть. У нас заводской метод есть для BiFunction или для BinaryOperator? А может что-то близкое к Function.identity(). Я тоже знаю про BinaryOperator.minBy() и BinaryOperator.maxBy(), но они больше "подробный" и не такие понятные методы, чем Function.identity().

Ну, разве короткая специальная лямбда недостаточно хороша?

fluffy 30.03.2021 15:40

Я не знаю ни одного такого метода, но вы можете предоставить свой собственный. Почему бы тебе не попробовать?

Thomas 30.03.2021 15:41

Кроме того, если в стандартной библиотеке нет ничего подобного, не стоит ли было бы легко создать новую? Да ладно, это банально.

fluffy 30.03.2021 15:43

Насколько мне известно, в стандартной библиотеке Java такого метода нет. Это могло быть по нескольким причинам, в том числе 1, которые разработчики Java забыли, 2, которые они не могли логически решить, какой из них следует вернуть (первый или второй?), 3 они не согласны с вами относительно того, как «часто» это используется, и думали, что это будет иметь небольшую ценность.

MC Emperor 30.03.2021 15:48

Да, я думаю, что все ваши ответы верны, спасибо за ваши предложения. Искал что-то в стандартной библиотеке, но, судя по всему, ничего подобного здесь нет.

Volodya Lombrozo 30.03.2021 16:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете легко объявить свои собственные методы:

public class BinaryOperators {
    
    public static <T> BinaryOperator<T> first() {
        return (first, second) -> first;
    }

    public static <T> BinaryOperator<T> second() {
        return (first, second) -> second;
    }

    public static <T> BinaryOperator<T> any() {
        return (first, second) -> ThreadLocalRandom.current().nextBoolean() ? first : second;
    }

}

а затем используйте их в своем коде:

Collectors.toMap(City::key, Function.identity(), BinaryOperators.first())

со статическим импортом:

Collectors.toMap(City::key, identity(), first())

Или просто не заморачивайтесь с приведенным выше кодом и используйте (a, b) -> a:

toMap(City::key, identity(), (a, b) -> a))

Довольно ясно и кратко, ИМО

И конечно же: public static <T> BinaryOperator<T> surpriseMe() { return (a, b) -> ThreadLocalRandom.current().nextBoolean() ? a : b; }

MC Emperor 30.03.2021 16:08

@MCEmperor =) замечательно. Спасибо.

Volodya Lombrozo 30.03.2021 16:11

Другие вопросы по теме