Слияние карт Android Java с пользовательской BiFunction

Используя Java на Android, я хочу объединить элемент в карту с пользовательской функцией переназначения.

Map<String, MyObject> map = new HashMap<String, MyObject>();
// init map with some values here....  then
MyObject xMyObject = new MyObject(123); // init this instance of MyObject
map.merge("key", xMyObject, myRemappingFunction);

Я понимаю, что Android Java не поддерживает Java 8 для лямбда-выражений. Поэтому я думаю, что мне нужно реализовать myRemappingFunction как BiFunction, но у меня проблемы с пониманием объявления интерфейса BiFunction, чтобы что-то компилировать.

public static BiFunction<? super MyObject,? super MyObject,? extends MyObject> remappingfunction()

Любые подсказки, пожалуйста?

Ключевой факт, которого я не знал и который способствовал моему замешательству, вызвавшему этот вопрос, заключается в том, что нотация «<? super MyObject>» называется «нижним подстановочным знаком» для Java Generics.

Larry Tseng 09.02.2019 06:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
269
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

remappingFunction — это реализация BiFunction<? super MyObject, ? super MyObject,? extends MyObject>, которая оценивается с использованием метода apply, который вам нужно определить здесь.

Рассмотрим пример, когда вы объедините целочисленный атрибут val (путем суммирования) вашего MyObject, если они сопоставлены с одним и тем же ключом, реализация будет выглядеть так:

map.merge("key", xMyObject, new BiFunction<MyObject, MyObject, MyObject>() {
    // this is the definition of what to do for two such values
    @Override
    public MyObject apply(MyObject myObject1, MyObject myObject2) {
        return new MyObject(myObject1.getVal() + myObject2.getVal());
    }
});

это также может быть представлено в лямбда как:

map.merge("key", xMyObject, 
                (myObject1, myObject2) -> new MyObject(myObject1.getVal() + myObject2.getVal()));

Обратите внимание, что для вашего случая, поскольку тип всегда MyObject, также работает конкретная реализация BinaryOperator<MyObject>, которая расширяет BiFunction.

Naman 07.02.2019 08:31

Спасибо! Это дает мне решение, которое компилируется без ошибок, и ваш первый ответ на реализацию - это то, что, я думаю, мне нужно использовать, учитывая сложный характер моего слияния объектов. Я одобрю, как только смогу убедиться, что мой новый код действительно работает (в ближайшее время). Спасибо за быстрый ответ.

Larry Tseng 07.02.2019 08:47

Ура, кажется, я достаточно понял ваш ответ, чтобы использовать его. Я также вижу свое замешательство в моем комментарии выше о том, что BinaryOperator<MyObject> является специализацией BiFunction<MyObject,MyObject,MyObject>, я бы не понял этот документ ссылка на сайт без вашего конкретного примера кода здесь. Использование BinaryOperator<MyObject> работает так же хорошо. Они могли бы использовать это в документации для Map.merge(). В конце концов, может ли существовать какая-либо другая функция BiFunction<>, в которой 3 типа параметров не равны для использования в Map.merge()?

Larry Tseng 09.02.2019 06:21

@LarryTseng разница в использовании BiFunction заключается в том, что он позволяет ? super V, ? super V, ? extends V получать возвращаемое значение дочернего типа для ввода родительских типов. Хотя это было бы невозможно с использованием BinaryOperator, поскольку это были бы либо все ? super V, либо ? extends V.

Naman 09.02.2019 06:25

Ах! Я вижу сейчас. Спасибо!

Larry Tseng 09.02.2019 06:29

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