1.1 lambda表达式
一、处理匿名内部类
1、Runnable接口
1 new Thread(new Runnable() { 2 public void run() { 3 System.out.println("hello world!!!"); 4 } 5 }).start(); 6 7 // lambda 8 new Thread(()->System.out.println("hello lambda!!!")).start();
说明:
- 上边的方式是原本匿名内部类方式
- 下边的方法是lambda表达式方式
lambda基本语法:(形参列表)->{方法体}
注意:
- 形参列表:(String x, String y)这样的基本形式
- 如果没有形参,使用"()",如上
- 如果参数类型可以被推断出来,使用(x,y)
- 如果是单个参数且类型可以被推断出来,直接使用x
- 方法体:如果只有一句话,可以去掉"{}",如上
2、Comparator接口
1 List<String> strList = Arrays.asList("zhaojigang","nana","tianya"); 2 //原来的方式 3 Collections.sort(strList, new Comparator<String>() { 4 @Override 5 public int compare(String s1, String s2) { 6 return s1.compareTo(s2); 7 } 8 }); 9 10 //lambda 11 Collections.sort(strList, (s1, s2)->s1.compareTo(s2));
说明:这里的s1和s2就被根据comparator的泛型和strList的泛型推断出了类型为String,可以省略参数类型。
二、方法引用
1 //lambda 2 Collections.sort(strList, (s1, s2)->s1.compareTo(s2)); 3 //方法引用 4 Collections.sort(strList, String::compareTo); 5 //lambda 6 strList.forEach(x->System.out.println(x)); 7 //方法引用 8 strList.forEach(System.out::println);
说明:
- 前两个语句效果一样,后两个效果一样,自己比对方法引用与lambda的哪些部分等价
- 集合类的foreach方法就是增强型for循环的再增强。
注意:
- 方法引用的语法
- 对象::实例方法=>等价于"提供方法参数的lambda表达式"
- 类::静态方法=>等价于"提供方法参数的lambda表达式"
- eg. System.out::println等价于x->System.out.println(x)
- 类::实例方法=>第一个参数是执行方法的对象
- eg. String::compareTo等价于(s1, s2)->s1.compareTo(s2)
三、局部变量
lambda操作的局部变量必须是final型的,即:在lambda表达式所使用到的局部变量(方法体内的变量或形参)只能被读取,不能被改变。
注意:列出这条约束的原因是防止线程不安全,可能会有疑问,局部变量是方法私有的,怎么会有线程安全问题?
解释:假设我在该方法体内,启动了一个线程并使用lambda表达式去操作一个局部变量count(注意该变量并没有在lambda中进行声明,但是lambda却可以用,这就是"闭包"),而在该线程外且在该方法体内,该方法也操作了count,这时可能就会有线程安全问题了。
四、接口的改变
java的接口也可以写实现default级别的实例方法和静态方法了。
1 public interface LambdaInterface { 2 //default方法 3 default void defaultMethod(){ 4 System.out.println("xxxx"); 5 } 6 //static方法 7 static void staticMethod(){ 8 System.out.println("xxxx"); 9 } 10 }
1 public class TestInterface implements LambdaInterface{ 2 public static void main(String[] args) { 3 LambdaInterface test = new TestInterface(); 4 test.defaultMethod();//default方法测试 5 6 LambdaInterface.staticMethod();//static方法测试 7 } 8 }
用途:当改造老的项目时,想在旧的接口中添加一些方法,但是又不想让该接口的旧的实现类去实现这些方法时,可以使用这个技巧。
1.1 lambda表达式相关推荐
- Lambda 表达式基础理论与示例
Lambda 表达式基础理论与示例 Lambda 表达式,也可称为闭包,推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lam ...
- lambda表达式树
一.定义: 表达式树又称为表达式目录树,以数据形式表示语言级代码.所有的数据都存储在树结构中,每个结点表示一个表达式(Expression). 二.要点: –Lambda表达式的参数类型可以忽略,因为 ...
- java 8 lambda reduce_JDK8新特性Lambda表达式体验
"Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstra ...
- java saf_Java 8 Lambda表达式探险
为什么? 我们为什么需要Lambda表达式 主要有三个原因: > 更加紧凑的代码 比如Java中现有的匿名内部类以及监听器(listeners)和事件处理器(handlers)都显得很冗长 &g ...
- lamda表达式python_Python--13 lambda表达式
python 允许使用lambda表达式来创建匿名函数 lambda表达式 >>>def ds(x): ... return 2 * x +1 ... >>> ds ...
- C++11:Lambda表达式(匿名函数)理解
C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象.即你可以理解为(Lambda 表达式实际上是一个函数,只是它没 ...
- java8 lambda 表达式详解
lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法 使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例 可以将 lambda ...
- Java8中Lambda表达式的10个例子
Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 Java代码 //Before Java 8: new Thread(new Runnable() ...
- 【读书笔记】Lambda表达式
Lambda表达式,是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型. Lambda表达式, 都是用"=>"运算符. 读作"goes t ...
- 【C++】lambda 表达式
1.lambda 表达式 1.1 lambda 特点 lambda表示一个可调用单元,可视为内联函数 范式 : 具有一个返回类型,一个参数列表,一个函数体 [captrue list](paramet ...
最新文章
- Spark 与MapReduce 资源调度方面的简单对比
- Spring IoC容器:BeanFactory和ApplicationContext谁才是Spring IoC容器
- 1025 反转链表 (25分)(最详细最简便)(套路模板)
- linux引导时输入特殊信息的含义
- python3字符串属性(二)
- linux svn启动和关闭(转)
- IQ不平衡补偿 Lowdin算法
- virtio数据结构总览 | 图
- js des加密 java_Java实现与JS相同的Des加解密算法完整实例
- C语言-main函数的参数
- CUDA里面GRID, BLOCK 边界检测
- Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级
- 这是我见过Java版的最好的OA系统,拿来即用,非常方便(附项目地址)
- 对Javascript的原型,原型链和继承的个人理解
- 数据库索引:位图索引
- web项目中如何启动爬虫程序?Django+Requests+Ajax制作可视化翻译界面详解
- 第十一届 蓝桥杯 省 模拟赛 试题+题解 C/C++描述
- 定义一个类描述分数,并提供加减乘除运算 以及分数化简
- Python 将中文大写数字转为阿拉伯数字
- HAL库自学笔记#1【通用TIM定时器】
热门文章
- java api接口报500_应用程序编程接口API,我们来聊一聊这个熟悉的名词
- java快速教程_Java快速入门
- 自检代码中trustmanager漏洞_2020-11微软漏洞通告
- redis ubuntu php 5.2,ubuntu 14.04下简易安装php5.5 + apache2 + redis + mysql
- ros系统支持java_创建一个rosjava package 并测试发布和接受消息
- 字符串相加 java_字符串相加-LeetCode(Java实现)
- 什么是对象的消息_SpringBoot+RabbitMQ方式收发消息,一文带你体验
- php企业号自定义菜单,用php实现微信企业号自定义菜单遇到问题,请大神指点!...
- Java jni 底层_Java中的native是如何实现的(JNI)
- 鸿蒙系统布局,华为的布局,开始了!第二款鸿蒙系统产品,即将亮相