一、处理匿名内部类

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表达式相关推荐

  1. Lambda 表达式基础理论与示例

    Lambda 表达式基础理论与示例 Lambda 表达式,也可称为闭包,推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lam ...

  2. lambda表达式树

    一.定义: 表达式树又称为表达式目录树,以数据形式表示语言级代码.所有的数据都存储在树结构中,每个结点表示一个表达式(Expression). 二.要点: –Lambda表达式的参数类型可以忽略,因为 ...

  3. java 8 lambda reduce_JDK8新特性Lambda表达式体验

    "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstra ...

  4. java saf_Java 8 Lambda表达式探险

    为什么? 我们为什么需要Lambda表达式 主要有三个原因: > 更加紧凑的代码 比如Java中现有的匿名内部类以及监听器(listeners)和事件处理器(handlers)都显得很冗长 &g ...

  5. lamda表达式python_Python--13 lambda表达式

    python 允许使用lambda表达式来创建匿名函数 lambda表达式 >>>def ds(x): ... return 2 * x +1 ... >>> ds ...

  6. C++11:Lambda表达式(匿名函数)理解

    C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象.即你可以理解为(Lambda 表达式实际上是一个函数,只是它没 ...

  7. java8 lambda 表达式详解

    lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法 使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例 可以将 lambda ...

  8. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子  例1 用Lambda表达式实现Runnable接口 Java代码   //Before Java 8: new Thread(new Runnable() ...

  9. 【读书笔记】Lambda表达式

    Lambda表达式,是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型. Lambda表达式, 都是用"=>"运算符. 读作"goes t ...

  10. 【C++】lambda 表达式

    1.lambda 表达式 1.1 lambda 特点 lambda表示一个可调用单元,可视为内联函数 范式 : 具有一个返回类型,一个参数列表,一个函数体 [captrue list](paramet ...

最新文章

  1. Spark 与MapReduce 资源调度方面的简单对比
  2. Spring IoC容器:BeanFactory和ApplicationContext谁才是Spring IoC容器
  3. 1025 反转链表 (25分)(最详细最简便)(套路模板)
  4. linux引导时输入特殊信息的含义
  5. python3字符串属性(二)
  6. linux svn启动和关闭(转)
  7. IQ不平衡补偿 Lowdin算法
  8. virtio数据结构总览 | 图
  9. js des加密 java_Java实现与JS相同的Des加解密算法完整实例
  10. C语言-main函数的参数
  11. CUDA里面GRID, BLOCK 边界检测
  12. Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级
  13. 这是我见过Java版的最好的OA系统,拿来即用,非常方便(附项目地址)
  14. 对Javascript的原型,原型链和继承的个人理解
  15. 数据库索引:位图索引
  16. web项目中如何启动爬虫程序?Django+Requests+Ajax制作可视化翻译界面详解
  17. 第十一届 蓝桥杯 省 模拟赛 试题+题解 C/C++描述
  18. 定义一个类描述分数,并提供加减乘除运算 以及分数化简
  19. Python 将中文大写数字转为阿拉伯数字
  20. HAL库自学笔记#1【通用TIM定时器】

热门文章

  1. java api接口报500_应用程序编程接口API,我们来聊一聊这个熟悉的名词
  2. java快速教程_Java快速入门
  3. 自检代码中trustmanager漏洞_2020-11微软漏洞通告
  4. redis ubuntu php 5.2,ubuntu 14.04下简易安装php5.5 + apache2 + redis + mysql
  5. ros系统支持java_创建一个rosjava package 并测试发布和接受消息
  6. 字符串相加 java_字符串相加-LeetCode(Java实现)
  7. 什么是对象的消息_SpringBoot+RabbitMQ方式收发消息,一文带你体验
  8. php企业号自定义菜单,用php实现微信企业号自定义菜单遇到问题,请大神指点!...
  9. Java jni 底层_Java中的native是如何实现的(JNI)
  10. 鸿蒙系统布局,华为的布局,开始了!第二款鸿蒙系统产品,即将亮相