• 主页
  • 归档
  • 分类
  • 照片墙
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 分类
  • 照片墙
  1. 1. Lamdba表达式语法
  2. 2. 方法引用
  3. 3. 构造器引用

Lamdba表达式(1)

2018-01-09 20:45:52
总字数 703
预计阅读时间 2 分钟

Lamdba表达式是Java8的一项重要的新特性
它是基于匿名内部类演化出的一种更加抽象的语法形式
由编译器去推断并包装为常规的代码

官方的解释为

一个不用被绑定到一个标识符上,并且可能被调用的函数

可以理解为是 一段带有输入参数的可执行语句块

1
2
3
List<String> names = new ArrayList<String>();
//在List当中加入若干元素
Collections.sort(names, (o1,o2)->o1.compareTo(o2));

上述代码中用到的Lamdba表达式其实就是相当于构建了一个实现了Comparator接口的匿名内部类
等价于以下代码

1
2
3
4
5
6
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});

也许下面的代码能更好地体现Lamdba表达式就是匿名类的另外一种写法

1
2
3
4
5
6
7
8
9
10
public class Main {
public static void main(String[] args) {
Demo d = ()->{return "aa";};
d.func();
}
}

interface Demo {
public String func();
}

Lamdba表达式语法

1
2
3
4
(Type1 param1, Type2 params,...,TypeN paramN) -> {
//若干语句...
return 表达式;
}

这是一般语法 , 也就是最完整的一种语法
但是通常用到Lamdba表达式的时候 , 都是方法中的语句并不复杂 , 逻辑简单的情况
否则会造成代码可读性很差
所以Lamdba就有很多种简化版 , 实际用的也多是简化版

  1. 编译器可以根据上下文推断参数的类型 , 大多数情况下参数类型可以省略
    1
    2
    3
    4
    (param1, params,...,paramN) -> {
    //若干语句...
    return 表达式;
    }
  2. 当参数只有一个 , 可以省略小括号
    1
    2
    3
    4
    param -> {
    //若干语句...
    return 表达式;
    }
  3. 当方法中只包含一条语句 , 可以省略大括号 return 和 最后的分号
    1
    param -> 表达式

其他要点

  • 与匿名类中的方法一样 , Lamdba可以访问其所在的外部类的成员 , 也可以访问其所在方法中的局部变量
  • Lamdba表达式中的this指向的并不是这个匿名类对象 , 而是指向其外部类对象
    所以如果是在一个静态方法中 , 则不能使用this

方法引用

方法引用可以在某些条件成立的情况下 , 更加简化Lamdba表达式的声明 , 格式有以下3种

  • 对象名称 :: 非静态方法
  • 类名称 :: 静态方法
  • 类名称 :: 非静态方法

前两种方式类似
例如System.out::println
等价于x->System.out.println(x);

最后一种方式 , 相当于把Lamdba表达式的第一个参数当做该方法的目标对象
例如String::toLowerCase
等价于x->x.toLowerCase();

构造器引用

语法是

  • 类名 :: new

例如 BigDecimal::new
等价于x->new BigDecimal(x)

  • Java

扫一扫,分享到微信

Lamdba表达式(2)-Stream
4.0、安全验证 
© 2024 夏夜梦星辰
鲁ICP备19028444号
Power By Hexo
  • 所有文章
  • 友情链接
  • 关于我
{{searchItem.query}}
标签: 分类:
  • maven
  • 持续集成
  • JMS
  • 线程
  • JavaScript
  • ECMAScript6
  • 单元测试
  • Promise
  • Web Worker
  • 函数
  • prototype
  • 模块化
  • 正则表达式
  • 数据库
  • MongoDB
  • 索引
  • 集群
  • 全文检索
  • flutter
  • dart
  • git
  • 版本控制
  • linux
  • shell
  • docker
  • nginx
  • jenkins
  • opencv
  • vim
  • react
  • react native
  • 前端
  • css
  • HTML5
  • Hexo
  • sass
  • Three.js
  • TypeScript
  • Vue
  • 组件化
  • base64
  • webpack
  • nodejs
  • gulp
  • TensorFlow
  • 机器学习
  • 算法
  • 动态规划
  • 数据结构
  • Java
  • JavaScript
  • MongoDB
  • flutter
  • Git
  • linux
  • react
  • 前端杂烩
  • 男生女生
  • 算法
  • 十年饮冰,难凉热血
  • †少女癌†
  • 猫与向日葵
  • coderfun
  • JENKINS
  • API管理后台
愿你最终能接纳每一面每一种的自己
独自活着便是团圆