Используя 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()
Любые подсказки, пожалуйста?




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.
Спасибо! Это дает мне решение, которое компилируется без ошибок, и ваш первый ответ на реализацию - это то, что, я думаю, мне нужно использовать, учитывая сложный характер моего слияния объектов. Я одобрю, как только смогу убедиться, что мой новый код действительно работает (в ближайшее время). Спасибо за быстрый ответ.
Ура, кажется, я достаточно понял ваш ответ, чтобы использовать его. Я также вижу свое замешательство в моем комментарии выше о том, что BinaryOperator<MyObject> является специализацией BiFunction<MyObject,MyObject,MyObject>, я бы не понял этот документ ссылка на сайт без вашего конкретного примера кода здесь. Использование BinaryOperator<MyObject> работает так же хорошо. Они могли бы использовать это в документации для Map.merge(). В конце концов, может ли существовать какая-либо другая функция BiFunction<>, в которой 3 типа параметров не равны для использования в Map.merge()?
@LarryTseng разница в использовании BiFunction заключается в том, что он позволяет ? super V, ? super V, ? extends V получать возвращаемое значение дочернего типа для ввода родительских типов. Хотя это было бы невозможно с использованием BinaryOperator, поскольку это были бы либо все ? super V, либо ? extends V.
Ах! Я вижу сейчас. Спасибо!
Ключевой факт, которого я не знал и который способствовал моему замешательству, вызвавшему этот вопрос, заключается в том, что нотация «<? super MyObject>» называется «нижним подстановочным знаком» для Java Generics.