В Java 8 Двоичный оператор является функциональным интерфейсом и расширяет Бифункция
.
Двоичный оператор | принимает два аргумента одного и того же типа и возвращает результат одного и того же типа своих аргументов.
@FunctionalInterface public interface BinaryOperatorextends BiFunction { }
Функция Bi
принимает два аргумента любого типа и возвращает результат любого типа.
@FunctionalInterface public interface BiFunction{ R apply(T t, U u); }
1. Двоичный оператор
1.1 В этом примере Бифункция <Целое число, Целое число, Целое число>
, которая принимает и возвращает один и тот же тип, может быть заменена на Двоичный оператор <Целое число>
.
package com.mkyong; import java.util.function.BiFunction; import java.util.function.BinaryOperator; public class Java8BinaryOperator1 { public static void main(String[] args) { // BiFunction BiFunctionfunc = (x1, x2) -> x1 + x2; Integer result = func.apply(2, 3); System.out.println(result); // 5 // BinaryOperator BinaryOperator func2 = (x1, x2) -> x1 + x2; Integer result2 = func.apply(2, 3); System.out.println(result2); // 5 } }
Выход
5 5
2. Двоичный оператор в качестве аргумента
2.1 В этом примере имитируется stream.reduce()
для суммирования всех целых
.
package com.mkyong; import java.util.Arrays; import java.util.List; import java.util.function.BinaryOperator; public class Java8BinaryOperator2 { public static void main(String[] args) { Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; Integer result = math(Arrays.asList(numbers), 0, (a, b) -> a + b); System.out.println(result); // 55 Integer result2 = math(Arrays.asList(numbers), 0, Integer::sum); System.out.println(result2); // 55 } public staticT math(List list, T init, BinaryOperator accumulator) { T result = init; for (T t : list) { result = accumulator.apply(result, t); } return result; } }
Выход
55 55
3. Интбинарный оператор
3.1 Если математические операции включают примитивные типы, такие как int
, измените IntBinaryОператор
для повышения производительности.
package com.mkyong; import java.util.function.IntBinaryOperator; import java.util.stream.IntStream; public class Java8BinaryOperator3 { public static void main(String[] args) { int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int result = math((numbers), 0, (a, b) -> a + b); System.out.println(result); // 55 int result2 = math((numbers), 0, Integer::sum); System.out.println(result2); // 55 IntStream } public static int math(int[] list, int init, IntBinaryOperator accumulator) { int result = init; for (int t : list) { result = accumulator.applyAsInt(result, t); } return result; } }
Выход
55 55
4. Двоичный оператор.maxBy() и Двоичный Оператор.min By()
4.1 В этом примере используется Бинарный оператор
и пользовательский Компаратор
для поиска разработчика с самой высокой и самой низкой оплатой из списка разработчиков.
package com.mkyong; import java.math.BigDecimal; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.function.BinaryOperator; public class Java8BinaryOperator4 { public static void main(String[] args) { Developer dev1 = new Developer("jordan", BigDecimal.valueOf(9999)); Developer dev2 = new Developer("jack", BigDecimal.valueOf(8888)); Developer dev3 = new Developer("jaden", BigDecimal.valueOf(10000)); Developer dev4 = new Developer("ali", BigDecimal.valueOf(2000)); Developer dev5 = new Developer("mkyong", BigDecimal.valueOf(1)); Listlist = Arrays.asList(dev1, dev2, dev3, dev4, dev5); // 1. Create a Comparator Comparator comparing = Comparator.comparing(Developer::getSalary); // 2. BinaryOperator with a custom Comparator BinaryOperator bo = BinaryOperator.maxBy(comparing); Developer result = find(list, bo); System.out.println(result); // Developer{name='jaden', salary=10000} // one line // find developer with highest pay Developer developer = find(list, BinaryOperator.maxBy(Comparator.comparing(Developer::getSalary))); System.out.println(developer); // Developer{name='jaden', salary=10000} // find developer with lowest pay Developer developer2 = find(list, BinaryOperator.minBy(Comparator.comparing(Developer::getSalary))); System.out.println(developer2); // Developer{name='mkyong', salary=1} } public static Developer find(List list, BinaryOperator accumulator) { Developer result = null; for (Developer t : list) { if (result == null) { result = t; } else { result = accumulator.apply(result, t); } } return result; } }
package com.mkyong; import java.math.BigDecimal; public class Developer { String name; BigDecimal salary; public Developer(String name, BigDecimal salary) { this.name = name; this.salary = salary; } //... }
Выход
Developer{name='jaden', salary=10000} Developer{name='jaden', salary=10000} Developer{name='mkyong', salary=1}
Рекомендации
- Двоичный оператор
- Java 8 Лямбда: Пример компаратора
- Поток Java 8.уменьшить() примеры
- Бифункциональный JavaDoc
- Примеры функций Java 8
- Java 8 Учебные пособия
Оригинал: “https://mkyong.com/java8/java-8-binaryoperator-examples/”