Il s'agit d'une interface fonctionnelle et peut donc être utilisée comme cible d'affectation pour une expression lambda ou une référence de méthode. La définition d'un BinaryOperator est "T apply(T t1, T t2)". Le BinaryOperator a en argument et en retour le même type.
public interface BinaryOperator<T> extends BiFunction<T,T,T>
Cette interface contient deux méthodes que nous détaillerons plus tard :
public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator);
public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator);
En étendant l'interface BiFunction, l'interface BinaryOperator hérite des méthodes suivantes :
R apply(T t, U u);
default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after);
Dans cette exemple nous alors utiliser le type Long. Par conséquent, on aura BinaryOperator<Long> qui étendra la classe BiFunction avec la déclaration BiFunction<Long, Long, Long>. On préfèrera utiliser la classe BiFunction uniquement si les types en entrée/sortie sont différents.
// BiFunction
final BiFunction<Long, Long, Long> biFunction = (a, b) -> a + b;
System.out.println(biFunction.apply(8L, 10L)); // 18
// BinaryOperator
final BinaryOperator<Long> binaryOperator = (a, b) -> a + b;
System.out.println(binaryOperator.apply(8L, 10L)); // 18
public static void main(final String[] args) {
final List<Long> myList = Arrays.asList(8L, 5L, 3L);
final BinaryOperator<Long> binaryOperator = (a, b) -> a + b;
System.out.println(BinaryOperationTest.add(myList, (a, b) -> a + b, 0L)); // 16
System.out.println(BinaryOperationTest.add(myList, binaryOperator, 0L)); // 16
}
public static <T> T add(final List<T> theList, final BinaryOperator<T> binaryOperator, final T init) {
T result = init;
for (final T list : theList) {
result = binaryOperator.apply(result, list);
}
return result;
}
Remarque : On peut noter qu'il y a une transformation automatique entre une expression lambda et son équivalent, ici BinaryOperator.
Quelques type primitifs ont leurs propre BinaryOperator, c'est le cas pour les entiers, les double et les long.
public static Long add(final List<Long> theList, final LongBinaryOperator binaryOperator, final Long init) {
Long result = init;
for (final Long list : theList) {
result = binaryOperator.applyAsLong(result, list);
}
return result;
}
public static void main(final String[] args) {
final List<Long> myList = Arrays.asList(8L, 5L, 3L);
final LongBinaryOperator binaryOperator = (a, b) -> a + b;
System.out.println(BinaryOperationTest.add(myList, (a, b) -> a + b, 0L)); // 16
System.out.println(BinaryOperationTest.add(myList, binaryOperator, 0L)); // 16
}
Comme vu précédemment, ces deux méthodes sont disponibles dans l'interface BinaryOperator. Elles prennent en entrée un comparator afin de récupérer le min ou le max.
Création de la classe DVD :
public class DVD {
private final String title;
private final Integer sold;
public DVD(final String title, final Integer sold) {
super();
this.title = title;
this.sold = sold;
}
// ...
}
Récupération du min et du max de l'objet DVD créé ci-dessous à l'aide du champ "sold".
public static DVD find(final List<DVD> theList, final BinaryOperator<DVD> theBinaryOperator) {
DVD result = null;
for (final DVD theDVD : theList) {
if (result == null) {
result = theDVD;
} else {
result = theBinaryOperator.apply(result, theDVD);
}
}
return result;
}
public static void main(final String[] args) {
final List<DVD> list = Arrays.asList(new DVD("A", 6), new DVD("B", 60), new DVD("C", 3), new DVD("D", 40), new DVD("E", 20));
final Comparator<DVD> comparing = Comparator.comparing(DVD::getSold);
// max
final BinaryOperator<DVD> maxBo = BinaryOperator.maxBy(comparing);
System.out.println(BinaryOperationTest.find(list, maxBo).getSold()); // 60
// min
final BinaryOperator<DVD> minBo = BinaryOperator.minBy(comparing);
System.out.println(BinaryOperationTest.find(list, minBo).getSold()); // 3
}
LauLem.com - Conditions Générales d'Utilisation - Informations Légales - Charte relative aux cookies - Charte sur la protection des données personnelles - A propos