Java Lambda行为参数化

我们可以将lambda表达式作为参数传递给方法。

例子

以下代码创建了一个名为Calculator的函数接口。

在Calculator中有一个称为calculate的方法,它接受两个int参数并返回一个int值。

在Main类中有一个引擎方法,它接受函数接口Calculator作为参数。它从计算器调用计算方法并输出结果。

在主方法中,我们用不同的lambda表达式调用引擎方法四次。public class Main {

public static void main(String[] argv) {

engine((x,y)-> x + y);

engine((x,y)-> x * y);

engine((x,y)-> x / y);

engine((x,y)-> x % y);

}

private static void engine(Calculator calculator){

int x = 2, y = 4;

int result = calculator.calculate(x,y);

System.out.println(result);

}

}

@FunctionalInterface

interface Calculator{

int calculate(int x, int y);

}

上面的代码生成以下结果。

注意

engine方法的结果取决于传递给它的lambda表达式。

引擎方法的行为被参数化。

通过其参数更改方法的行为称为行为参数化。

在行为参数化中,我们将在lambda表达式中封装的逻辑传递给数据的方法。

行为参数化模糊性

编译器并不总是可以推断lambda表达式的类型。

一种情况是将lambda表达式传递给重载的方法。

在以下代码中有两个函数接口。 一个是int值计算,另一个用于long值。

在Main类中有称为engine的重载方法。 一个是期望IntCalculator,另一个是LongCalculator。

在main方法中,我们必须指定lambda表达式的参数,以指示我们要使用的重载函数的编译器。public class Main {

public static void main(String[] argv) {

engine((int x,int y)-> x + y);

engine((long x, long y)-> x * y);

engine((int x,int y)-> x / y);

engine((long x,long y)-> x % y);

}

private static void engine(IntCalculator calculator){

int x = 2, y = 4;

int result = calculator.calculate(x,y);

System.out.println(result);

}

private static void engine(LongCalculator calculator){

long x = 2, y = 4;

long result = calculator.calculate(x,y);

System.out.println(result);

}

}

@FunctionalInterface

interface IntCalculator{

int calculate(int x, int y);

}

@FunctionalInterface

interface LongCalculator{

long calculate(long x, long y);

}

上面的代码生成以下结果。

注意1

要解决歧义,我们可以通过指定参数的类型将隐式lambda表达式更改为explicit。这是为上面的代码做的。

或者我们可以使用cast如下。当第一次调用引擎时,我们将lambda表达式转换为IntCalculator。public class Main {

public static void main(String[] argv) {

engine((IntCalculator) ((x,y)-> x + y));

engine((long x, long y)-> x * y);

engine((int x,int y)-> x / y);

engine((long x,long y)-> x % y);

}

private static void engine(IntCalculator calculator){

int x = 2, y = 4;

int result = calculator.calculate(x,y);

System.out.println(result);

}

private static void engine(LongCalculator calculator){

long x = 2, y = 4;

long result = calculator.calculate(x,y);

System.out.println(result);

}

}

@FunctionalInterface

interface IntCalculator{

int calculate(int x, int y);

}

@FunctionalInterface

interface LongCalculator{

long calculate(long x, long y);

}

上面的代码生成以下结果。

注意2

或者我们可以避免直接使用lambda表达式作为参数。我们可以将lambda表达式分配给一个函数接口,然后将该变量传递给该方法。下面的代码显示了这种技术。public class Main {

public static void main(String[] argv) {

IntCalculator iCal = (x,y)-> x + y;

engine(iCal);

engine((long x, long y)-> x * y);

engine((int x,int y)-> x / y);

engine((long x,long y)-> x % y);

}

private static void engine(IntCalculator calculator){

int x = 2, y = 4;

int result = calculator.calculate(x,y);

System.out.println(result);

}

private static void engine(LongCalculator calculator){

long x = 2, y = 4;

long result = calculator.calculate(x,y);

System.out.println(result);

}

}

@FunctionalInterface

interface IntCalculator{

int calculate(int x, int y);

}

@FunctionalInterface

interface LongCalculator{

long calculate(long x, long y);

}

上面的代码生成以下结果。

java lambda 多个参数_Java Lambda行为参数化相关推荐

  1. java方法传对象参数_Java方法中的参数太多,第2部分:参数对象

    java方法传对象参数 在上一篇文章中 ,我研究了与方法和构造函数的长参数列表相关的一些问题. 在那篇文章中,我讨论了用自定义类型替换基元和内置类型以提高可读性和类型安全性. 这种方法使方法或构造函数 ...

  2. java 接口校验接收参数_java接口参数校验

    (可扩充) 命令编号 命令名称 参数命令 提取现场机时间 上传现场机时间 设置现... 接口标准> (以下简称"接口标准" ) <数据对接接口校验规则> < ...

  3. java main命令行参数_java使用命令行参数

    有时你想在运行程序时将信息传递到一个程序中.这通过将命令行参数(command-line arguments )传递给main() 来实现.命令行参数是程序执行时在命令行中紧跟在程序名后的信息.在Ja ...

  4. java lambda 两个冒号_java lambda 表达式中的双冒号的用法说明 ::

    双冒号运算就是java中的[方法引用],[方法引用]的格式是 类名::方法名 注意是方法名哦,后面没有括号"()"哒.为啥不要括号,因为这样的是式子并不代表一定会调用这个方法.这种 ...

  5. java servlet获取url参数_Java Servlet如何获取请求的参数值?

    ## Servlet如何获取请求的参数 ## > 使用Request常用API来获取参数 > 这里演示的表单的提交 > 用到的是`getParameter()`和`getParame ...

  6. java中对象作为参数_java中对象引用,特别作为参数时候注意事项

    1.基础知识 1Byte=8bit Byte和byte一个是对象,一个是基本数据类型而已,都是8bit 2.java中对象引用和值传递: (1).java中若一对象当作参数就是相当于,将变量对应的指向 ...

  7. java编译命令带参数_java编译命令基础知识点

    我们在对计算机下达指令时,人类的语言它是不能够明白,需要通过编译的时候翻译成计算机能听懂的语言.编译过程中会调用javac命令,这点大家可能接触的不多,毕竟是是计算机程序内部运行时的操作.下面我们就编 ...

  8. java 方法体 out 参数_Java方法详解

    方法详解 1.方法的定义 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合,包含于类或对象中:在程序中被创建,在其它地方被引用 设计方法的原则:要遵守原子性,即一个 ...

  9. java中ur 传参数_java参数传递(超经典)

    Java中的参数传递机制一直以来大家都争论不休,究竟是"传值"还是"传址(传引用)",争论的双方各执一词,互不相让.不但"菜鸟"们一头雾水, ...

最新文章

  1. AMI:加密的机器映像。卷
  2. 一般使用机器学习算法遵循的步骤
  3. 【转】计算机学会推荐国际学术期刊
  4. boost::multi_array模块确保 multi_arrays 与 STL 容器一起使用
  5. Spring MVC之@RequestMapping 详解
  6. Nacos客户端配置
  7. StringBuffer类的常用方法
  8. es6 字符串的 Iterator 接口
  9. 南京大学python_python split()函数
  10. DOCTYPE 声明
  11. mybatis 批量提交清除缓存_重学Mybatis(三)-------缓存 (含面试题)
  12. UIScrollerView ,UIPageControl混搭使用,添加定时器,无限循环滚动
  13. 微信取消分享后还是执行成功函数
  14. excel几个数相加等于某个数_EXCEL如何求出哪几个单元格里的数字之和等于某个特定值...
  15. 树莓派Raspberry Pi 4B
  16. React Native ES6写法总结
  17. 计算机网络网络层之虚电路网络
  18. 【产业互联网周报】云厂商加速布局政企市场:华为云发布七款新产品;腾讯政务战略升级;钉钉发布数字区县解决方案...
  19. MATLAB 神经网络NAR时间序列做预测
  20. nRF Connect SDK(NCS)-Windows开发环境搭建

热门文章

  1. 材料成形计算机辅助设计,材料成型及计算机辅助设计(综述)
  2. c语言编译时检查逻辑错误吗,C语言陷阱与技巧20节,自定义“编译时”assert方法,在代码编译阶段检查“逻辑”错误...
  3. linux系统嵌入式编译环境,Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解...
  4. 星痕 轻松实现大屏数据可视化_数据美的历程有多难?大屏可视化轻松帮你实现...
  5. 职称考试取消英语和计算机,强烈建议取消所谓的英语职称和计算机考试
  6. 初级前端工程师笔试技巧总结,祝你顺利拿高分
  7. 【APICloud系列|33】移动应用软件加固步骤,适合所有的安卓应用市场
  8. c语言程序设计徐立辉答案,C语言程序设计 牛志成,徐立辉,刘冬莉著 清华大学出版社 9787302165620...
  9. Ext grid js上移下移样例
  10. step7db块寻址_step7中的难点:间接寻址示例,中文详细注释。