lambda表达式中的类型是通过上下文推断出来的,类似String[] strArr = {"as","sd"};右边元素的子类型。

匿名内部类的情况:需要引用它所在方法里的变量。这时候,需要将变量声明为final。声明为final,意味着不能为其重复赋值,同时也意味着在使用final变量时,实际上时在使用赋给该变量的一个特定的值。
java 8虽然放松了这一限制,可以引用非final变量,但是该变量在既成事实上必须是final,虽然无需将变量声明为final,但是在Lambda表达式中,也无法用作非终态变量,如果坚持用作非终态变量,编译器就会报错。

函数接口
函数接口是只有一个抽象方法的接口,用作Lambda表达式的类型
接口里面只有一个抽象方法。
接口中单一方法的命名并不重要,只要方法签名和Lambda表达式的类型匹配即可。可以在看书接口中为参数起一个有意义的名字,增加代码易读性,编译更透彻的理解参数的用途。
函数接口可以接收1个或多个参数,返回或不返回值,还可以使用泛型,这完全取决于你要干什么。
java中频繁出现的函数接口,在Java开发工具包(JDK)中提供的一组核心接口会频繁出现,大概如下,列出来你可能会便于理解下:
接口 参数 返回类型 示例
Predicate<T> T boolean 这张唱片已经发行了吗
Consume<T> T void 输出一个值
Function<T,R> T R 获取Artist对象的名字
Supplier<T> None T 工厂方法
UnaryOperator<T> T T 逻辑非(!)
BinaryOperator<T> (T,T) T 求两个数的乘机(*)

类型推断
某些情况下,用户需要手动指明类型,建议大家根据自己或者项目组的习惯,采用让代码最便于阅读的方法。有时候省略类型信息可以减少干扰,更易于弄清情况;而有时候却需要类型信息帮助理解代码。
Lambda表达式中的类型推断,实际上时java 7就引入的目标类型推断的拓展。读者可能已经知道java7中的菱形操作符,它可以使得javac推断出泛型参数的类型。
例子:使用菱形操作符省略手动声明类型
public void testGenericity(){
Map<String, Integer> oldWorldCOunts = new HashMap<String, Integer>();
Map<String, Integer> diamondWorldCounts = new HashMap<>();
useHashMap(new HashMap<>());
}
public void useHashMap(Map<String, String> values){

}
java 7中程序员可省略构造函数的泛型类型,java 8 更进一步,程序员可省略Lambda表达式中的所有参数类型。这不是魔法,javac根据Lambda表达式上下文信息就能推断出参数的正确类型。程序依然要经过类型检查来保证运行的安全性,但不再用显式声明类型罢了。这就是所谓的类型推断。
上面代码中的useHashMap(new HashMap<>())在java7中时无法通过编译的,java8中对类型推断系统进行了改善。

public void typeDeduce(){
Predicate<Integer> atLeast5 = x -> x > 5 ;
}
Predicate也是一个Lambda表达式,和前文中ActionListener不同的是,它返回一个值。在上面例子中,表达会x > 5是Lambda表达式的主体。这样的情况下,返回值就是Lambda表达式主体的值。
//Predicate接口的源码,接受一个对象,返回一个布尔值
public interface Predicate<T> {
boolean test(T t);
}
//略复杂的类型推断
BinaryOperator<Long> addLongs = (x, y) -> x + y;
类型推断系统相当智能,但若信息不够,类型推断系统也无能为力。系统不会漫无目的的瞎猜,而会终止操作并报告编译错误,寻求帮助。
BinaryOperator addLongs = (x, y) -> x + y;会报错 Operator '% #x002B;' cannot be applied to java.lang.Object, java.lang.Object.

1、lambda表达式的更多相关文章

  1. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  2. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  3. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  4. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  5. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  6. 背后的故事之 - 快乐的Lambda表达式(二)

    快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...

  7. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. Lambda 表达式递归用法实例

    注意: 使用Lambda表达式会增加额外开销,但却有时候又蛮方便的. Windows下查找子孙窗口实例: HWND FindDescendantWindows(HWND hWndParent, LPC ...

  9. Spark中Lambda表达式的变量作用域

    通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...

  10. 释放Android的函数式能量(I):Kotlin语言的Lambda表达式

    原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...

随机推荐

  1. receive.denyCurrentBranch 推送错误解决

    场景: 1.搭建Ok了一git服务器 2.本机上的现有源码,现在想纳入git源码管理 操作: 1.服务器上创建了工程仓库 git init 2. 客户端使用tortoisegit添加并提交要纳入源码管 ...

  2. mysql 数据操作 单表查询 having 过滤

    SELECT 字段1,字段2... FROM 库名.表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 1.首先找到表 库.表 ...

  3. centos 目录文件管理 mkdir,rm,touch,误删文件extundelete,cp,mv,cat,more,less ,head,tail,chown,chmod ,umask 第四节课

    centos 目录文件管理 mkdir,rm,touch,误删文件extundelete,cp,mv,cat,more,less ,head,tail,chown,chmod ,umask  第四节课 ...

  4. PHP生成唯一RequestID类

    https://blog.csdn.net/fdipzone/article/details/79939431 本文介绍PHP生成唯一RequestID类,使用session_create_id()与 ...

  5. PHP指定概率算法

    转载来源链接: https://blog.csdn.net/sinat_35861727/article/details/54980807 PHP指定概率算法,可用于刮刮卡,大转盘等抽奖算法. 假设: ...

  6. cocos代码研究(12)UI之Widget学习笔记

    理论基础 Widget类,所有UI控件的基类. 这类继承自ProtectedNode和LayoutParameterProtocol. 如果你想实现自己的UI控件,你应该继承这个类. 被 VideoP ...

  7. Android ContentResolver

    在Android 应用程序之间数据共享—-ContentResolver中,已经说明了Android是如何实现应用程序之间数据共享的,并详细解析了如何获取其他应用 程序共享的数据.ContentPro ...

  8. ruby中的预定义变量(Predifined Variables)

  9. Java IO的Reactor模式

    1.    Reactor出现的原因 Reator模式是大多数IO相关组件如Netty.Redis在使用时的IO模式,为什么需要这种模式,如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务 ...

  10. Python的星号(*)和双星号(**)用法

    ①引言 在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法是在变量前加单个星号或两个星号,实现多参数的传人或变量的拆解. ②什么是星号变量 最初,星号变量是用在函数的参数传递上的 ...