BinaryOperator示例

在Java8中,BinaryOperator是一个函数接口,它集成BiFunction

BinaryOperator接收两个同样类型的实参,返回和参数同样类型的结果类型

BinaryOperator.java

@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T> {}

BiFunction接收两个任意类型的实参,返回任意类型的结果

BiFunction.java

@FunctionalInterface
public interface BiFunction<T, U, R> {R apply(T t, U u);
}

BinaryOperator

下面这个示例中,BiFunction<Integer, Integer, Integer>接收参数类型和返回结果的类型是一样的,因此可以用BianryOperator替换

import java.util.function.BiFunction;
import java.util.function.BinaryOperator;public class Java8BinaryOperator1 {public static void main(String[] args) {// BiFunctionBiFunction<Integer, Integer, Integer> func = (x1, x2) -> x1 + x2;Integer result = func.apply(2, 3);System.out.println(result); // 5// BinaryOperatorBinaryOperator<Integer> func2 = (x1, x2) -> x1 + x2;Integer result2 = func.apply(2, 3);System.out.println(result2); // 5}
}

输出

5
5

BinaryOperator作为参数

下面示例演示了使用stream.reduce()来对所有Integer进行求和

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); // 55Integer result2 = math(Arrays.asList(numbers), 0, Integer::sum);System.out.println(result2); // 55}public static <T> T math(List<T> list, T init, BinaryOperator<T> accumulator) {T result = init;for (T t : list) {result = accumulator.apply(result, t);}return result;}
}

输出

55
55

IntBinaryOperator

如果数学操作基本数据类型,比如int,那么使用IntBinaryOperator可以获得更好的性能。

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); // 55int result2 = math((numbers), 0, Integer::sum);System.out.println(result2); // 55}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

BinaryOperator::maxBy()和BinaryOperator.minBy()

下面示例展示了使用BinaryOperator和自定义的比较器从开发者列表中找到薪资最好和最低的开发者

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));List<Developer> list = Arrays.asList(dev1, dev2, dev3, dev4, dev5);// 1. Create a ComparatorComparator<Developer> comparing = Comparator.comparing(Developer::getSalary);// 2. BinaryOperator with a custom ComparatorBinaryOperator<Developer> bo = BinaryOperator.maxBy(comparing);Developer result = find(list, bo);System.out.println(result);     // Developer{name='jaden', salary=10000}// one line// find developer with highest payDeveloper developer = find(list, BinaryOperator.maxBy(Comparator.comparing(Developer::getSalary)));System.out.println(developer);  // Developer{name='jaden', salary=10000}// find developer with lowest payDeveloper developer2 = find(list, BinaryOperator.minBy(Comparator.comparing(Developer::getSalary)));System.out.println(developer2); // Developer{name='mkyong', salary=1}}public static Developer find(List<Developer> list, BinaryOperator<Developer> accumulator) {Developer result = null;for (Developer t : list) {if (result == null) {result = t;} else {result = accumulator.apply(result, t);}}return result;}
}

Developer.java

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}

BinaryOperator示例相关推荐

  1. 【Java 8 新特性】Java 8 UnaryOperator和BinaryOperator示例

    Java 8 UnaryOperator和BinaryOperator示例 UnaryOperator BinaryOperator BinaryOperator.maxBy和BinaryOperat ...

  2. binaryoperator java_BinaryOperatorT接口的用法示例

    java Function函数中的BinaryOperator接口用于执行lambda表达式并返回一个T类型的返回值,下面的BinaryOperator用法示例让你简单了解一下.import java ...

  3. stream filter 用法_JDK1.8新特性Stream和Collectors19个常用示例总结

    关于Stream和Collectors的用法,这应该是总结的最全的文章了,大家可以收藏一下. 一:简介 java.util.Stream 表示能应用在一组元素上一次执行的操作序列.Stream 操作分 ...

  4. c++ 11新特性总结_JDK1.8新特性Stream和Collectors19个常用示例总结

    关于Stream和Collectors的用法,这应该是总结的最全的文章了,大家可以收藏一下. 一:简介 java.util.Stream 表示能应用在一组元素上一次执行的操作序列.Stream 操作分 ...

  5. java 根据类名示例化类_Java收集器类– 18个示例

    java 根据类名示例化类 Java Collectors is a utility class that provides many useful implementations of the Co ...

  6. Java 8 辣么大(lambda)表达式不慌之—–(五)示例-Collectors中的统计、分组、排序等

    Java 8 辣么大(lambda)表达式不慌之-–(五)示例-Collectors中的统计.分组.排序等 summarizingInt 按int类型统计 maxBy取最大/minBy取最小 aver ...

  7. Java Streams:流操作及示例

    正如我们在Java Streams:流创建中所学到的,流管道由源.零个或多个中间操作和一个终端操作组成. 我们还了解到,streams流是懒惰的:仅当终端操作启动时,才对源数据执行计算. 在本文中,我 ...

  8. .net连接mysql数据_.net连接MYSQL数据库的方法及示例!

    连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...

  9. CPU Cache原理与示例

    CPU Cache原理与示例 基础知识 现在的 CPU 多核技术,都会有几级缓存,老的 CPU 会有两级内存(L1 和 L2),新的CPU会有三级内存(L1,L2,L3 ),如下图所示: 其中:  ...

  10. 编译器 llvm clang 源码转换示例

    编译器 llvm clang 源码转换示例 从git获取llvm项目的源码方式: git clone https://github.com/llvm/llvm-project.git 下载源码后,进入 ...

最新文章

  1. RabbitMQ超详细安装教程(Linux)
  2. 职坐标c语言,C/C++知识点之hexdump的C语言实现
  3. 链表每k个反转 java_K 个一组翻转链表
  4. C++:流类库与输入输出
  5. 【Python】line.strip().split(‘,‘)含义
  6. 深圳大学计算机就业报告,深圳大学2020届毕业生就业质量报告.pdf
  7. 书脊开胶了用什么胶粘_鞋子开胶还傻傻用502粘?劝你别做无用功,用这笨招天天穿新鞋...
  8. Web性能瓶颈查找经验总结
  9. C# 文件读写系列二
  10. 网络挖掘初探索(2)_NEO4J图可视化
  11. ESP32实现Wave(.wav)音频文件输出
  12. 如何打包c#编写的程序
  13. docker之旅,附带实例脚本
  14. 一元二次方程abc决定什么_二次函数中的a,b,c各决定什么?
  15. xshell报错-要继续使用此程序,您必须应用最新的更新或使用新版本
  16. IntelliJ IDEA2017.3 安装破解过程
  17. 单循环链表实现(设立尾指针)(第二章 P35)
  18. 前端性能优化:启用 gzip
  19. vs2010自定义消息与vc6.0不太一样
  20. java连接pda_JAVA手机、PDA程序设计入门

热门文章

  1. 如何查看电脑上曾记录的账号密码
  2. PCB多层板设计规范
  3. Cheat Engine游戏脚本修改器通关教程(脑残版Step1-Step8)
  4. 计算机网络语音传输杂音回音,语音时有回音和杂音,怎么消除?
  5. 计算机软件网络工程师考试试题,网络工程师考试试题及答案.doc
  6. 一文了解知识图谱能做什么、本文含Jiagu自然语言处理工具试用、知识图谱实战。
  7. 教你用Python批量下载音乐功能,无需安装播放器,直接下载!
  8. 混合云存储跨云灾备方案之跨云备份
  9. [人工智能-深度学习-35]:卷积神经网络CNN - 常见分类网络- GoogLeNet Incepetion网络架构分析与详解
  10. 系统找不到指定的文件