为什么java8的lambda不支持函数式调用

  1.     当把一个数据结构包装成Stream后就偠开始对里面的元素进行各类操作了。常见的操作可以归类如下  
  2.     通过一个predicate接口来过滤并只保留符合条件的元素,该操作属于中间操作所以我们可以在过滤后的结果来应用其他Stream操作(比如forEach)。forEach需要一个函数来对过滤后的元素依次执行forEach是一个最终操作,所以我们不能在forEach之後来执行其他Stream操作  
  3.     需要注意的是排序只创建了一个排列好后的Stream,而不会影响原有的数据源排序之后原数据list是不会被修改的:  

dubbo技术学习,更多知识请访问

}

在很多其他语言中函数是一等公民。例如 JavaScript 中函数(Function)和字符串(String)、数字(Number)、对象(Object)等一样是一种数据类型。可以这样定义函数:

也可以将函数作为参数:

在 Java 中函数不是一等公民。如果想要像其他语言一样定义一个函数只能通过定义一个接口来实现,例如 Runnable

在 Java 8 之前,可以通过匿名类的方式来創建 Runnable

是不是看起来像 JavaScript 的函数定义:

java.util.function 包下定义了大量的函数式接口,每个接口都有且只有一个抽象方法这些接口的区别在于其中的抽象方法的参数和返回值不同。

当一个接口中只有一个方法时(即满足函数式接口定义)此时通过匿名类的语法来编写代码显得比较笨偅。使用 lambda 表达式可以将功能作为参数将代码作为数据。

一个 Lambda 表达式分为以下三个部分:

  • Body : 包含一个表达式或者一整块代码

定义一个函数式接口对象用于求两个 int 之和,包含两个 int 类型参数 xy返回 x + y 的值:

 

定义一个函数式接口对象,无参数返回42:

定义一个函数式接口对象,鼡于输出字符串包含一个 String 类型的参数 s,无返回值:

如果 lambda 表达式只是调用一个已有的方法那么可以直接使用方法引用。

 

改用方法引用更加简洁:

 
 
 

方法引用有以下几种类型:

1、类名::静态方法名 : 静态方法引用
例如定义一个 max 函数式接口对象用于求两个 int 中的最大值:

2、对象名::非静态方法名 : 对象的方法引用
例如定义一个 println 函数式接口对象,用于输出字符串:

 
 
 

即调用第一个参数 s1concat 方法传入参数 s2

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信