lamda 是Java8中增加的一个新特性。lamda表达式语法很简单,使用-> 将参数列表和表达式体分割开来。
(Type1 param1, Type2 param2, ..., TypeN paramN) -> { //do somthing}
(int x,int y)-> x+y 等价于 (int x,int y)->{x+y;}
如果有一个列表[1,2,3,4,5,6] 需要遍历并打印出来,如果不是用lamda表达式实现方式如下:
List<Integer> list=Arrays.asList(1,2,3,4,5,6); list.forEach(new Consumer<Integer>() { @Override public void accept(Integer t) { System.out.println(t); } });
而使用lamda表达式的写法则如下:
List<Integer> list=Arrays.asList(1,2,3,4,5,6); list.forEach(i->System.out.print(i));
当lambda表达式只是调用现有类中的具名方法时,编写lambda表达式更好的方式是使用已有的名字。
List<Integer> list=Arrays.asList(1,2,3,4,5,6); list.forEach(System.out::println);
通过上面的描述我们对Lambda有了一个大概的印象。Lambda可以简单的理解为一个匿名函数,虽然没有名字但是具有参数列表,方法体,返回类型以及抛出异常列表。
Arrays.asList(1,2,3,4,5,6).forEach(System.out::println);
这段代码是如何确定类型的呢? 首先可以推断出列表中的类型为Integer,forEach接收的表达式参数类型就是 Integer。
静态方法 refType::staticMethod (args)->refType.staticMethod(args);
绑定实例 expr::instMethod
未绑定实例 RefType::instMethod
构造器 ClsName::new
list.forEach(Integer::new); list.forEach(String::valueOf);
通过上面的示例可以看到lamda可以和匿名内部类进行转换,当然不是所有内部类都可以替换为lamda表达式的,lamda表达式必须实现一个函数式接口(java.util.function);但是二者还是有很多显著却别的。
- 内部类会创建一个拥有唯一标示的新对象,而lamda表达式可能没有,也可能有,这取决于具体实现。
- 内部类的声明会创建一个新的命名作用域,在这个作用域中,this,super指的是内部类本身的当前实例;而lamda 表达式不会引入任何新的命名作用域。
public class Hello { Runnable r1=()->{System.out.println(this);}; Runnable r2=new Runnable() { @Override public void run() { System.out.println(this); } }; public static void main(String ...args){ new Hello().r1.run(); new Hello().r2.run(); } }
结果是:
com.david.demo.lamda.core.Hello@4eec7777 com.david.demo.lamda.core.Hello$1@3b07d329
java.util.function中提供的基本函数式接口有:
void Consumer<T> (T t) ; 如:s->System.out.println(s);
boolean Predicate<T>(T t); 如: s->s.isEmpty();
T Supplier<T>(); 如: ()->new String();
U Function<T,U>(T t); 如: s->new Integer(s);
相关推荐
JavaSE6学习笔记是针对Java初学者和进阶者的一份宝贵资料,由知名讲师李兴华的培训课堂笔记汇编而成。这份笔记全面、详细地涵盖了Java SE 6版本的核心概念和技术,对于理解Java编程语言的基础以及进阶特性具有重要...
【AI大模型】的学习笔记涵盖了从基础到进阶的各种知识点,尤其关注了GPT系列模型的发展和能力。GPT-3作为其中的代表性工作,它的出现标志着AI模型参数规模的巨大跃升,拥有1750亿参数,这使得模型具备了强大的few-...
`.txt`文件可能是笔记或额外的代码示例,`.url`文件则可能指向相关的在线资源,如编程论坛或教程网站,这些都能为深入学习提供帮助。 总的来说,Lambda表达式的学习需要掌握它的基本语法、作用以及如何在实际项目中...
在本主题中,“变边界层的滑膜控制simulink+手写笔记”是关于如何利用Simulink来实现这一控制算法的一个实例,用于跟踪期望轨迹。Simulink是MATLAB的一个扩展工具箱,它允许用户通过图形化界面构建和仿真动态系统的...
在描述中提到的“Python学习笔记,复习巩固,大作业!!!”暗示这份资料可能不仅包括作业,还可能有学习笔记,这些笔记可能涵盖了Python的基础知识、进阶概念以及可能的实战项目,旨在帮助学习者巩固所学内容。 在...
通过这份"Python学习笔记",学习者可以深入理解和掌握以上这些概念,并通过"作业"部分实践应用,提高编程技能。对于初学者来说,这是一个很好的学习路径,理论与实践相结合,能有效提升编程能力。而对于有一定基础的...
最大预设零点问题的matlab代码机器学习笔记 线性和多项式回归 数值预测和预测。 属于监督学习类别,因为训练数据包含标记的(数字)数据。 通过对回归参数使用优化算法进行训练。 优化目标是成本函数的减少,成本...
CS笔记,顾名思义,是一份关于计算机科学(Computer Science,简称CS)的学习资料,主要涉及了Python编程语言的相关内容。Python是一种广泛应用于数据处理、科学计算、Web开发、自动化脚本等多个领域的高级编程语言...
Bard 是谷歌最新推出的 AI 聊天机器人,基于 LaMDA 训练,专门针对对话进行阅读训练,拥有非常强大的对话能力,能够理解用户的语境和语气,生成合适的回答,并且还能为用户提供合适的建议和信息。 知识点2:Bard 的...
Python是一种高级编程语言,以其简洁、易读的语法而闻名,广泛应用于数据科学、机器学习、Web开发等多个领域。通过Codecademy的课程,学习者可以逐步掌握Python的基础到进阶知识,为自己的编程技能打下坚实基础。 ...
"CS50: 我的CS50课程代码"很可能是某位学生或者参与者在学习CS50过程中编写的代码集合,这个压缩包文件"CS50-main"可能包含了整个课程中的项目代码、实验练习以及可能的笔记或解决方案。 在CS50课程中,Python作为...
100_Days_of_Code-main文件可能包含参与者每天完成的代码、日志、笔记或者项目文件,通过这些文件可以跟踪和回顾每天的学习进度和成果。通过这样的系统化学习,开发者将能够全面掌握Python编程,并建立起强大的编程...
在"superb_preparation-master"这个压缩包中,可能包含了上述知识点的练习题、解决方案或者笔记,可以帮助你深入理解和巩固这些Python3的核心知识。通过不断实践和刷题,例如在LeetCode上解决相关问题,可以有效地...