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 extends BiFunction
Cette interface contient deux méthodes que nous détaillerons plus tard :
public static BinaryOperator minBy(Comparator super T> comparator);
public static BinaryOperator 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 BiFunction andThen(Function super R, ? extends V> after);
Dans cette exemple nous alors utiliser le type Long. Par conséquent, on aura BinaryOperator
// BiFunction
final BiFunction biFunction = (a, b) -> a + b;
System.out.println(biFunction.apply(8L, 10L)); // 18
// BinaryOperator
final BinaryOperator binaryOperator = (a, b) -> a + b;
System.out.println(binaryOperator.apply(8L, 10L)); // 18
public static void main(final String[] args) {
final List myList = Arrays.asList(8L, 5L, 3L);
final BinaryOperator 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 add(final List theList, final BinaryOperator 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 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 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 theList, final BinaryOperator 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 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 comparing = Comparator.comparing(DVD::getSold);
// max
final BinaryOperator maxBo = BinaryOperator.maxBy(comparing);
System.out.println(BinaryOperationTest.find(list, maxBo).getSold()); // 60
// min
final BinaryOperator minBo = BinaryOperator.minBy(comparing);
System.out.println(BinaryOperationTest.find(list, minBo).getSold()); // 3
}