Lambda表达式简单使用
来源:互联网 发布:sql数据库编辑器 编辑:程序博客网 时间:2024/05/30 23:49
1. 依赖添加
工程的build.gradle里面添加classpath 'me.tatarka:gradle-retrolambda:3.2.5'app模块的build.gradle里面添加apply plugin:'me.tatarka.retrolambda'compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8}
2.简单使用
匿名内部类常规写法Button id_btn = (Button) findViewById(R.id.id_btn); id_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.e("initListener","onClick"); }});lambda表达式写法id_btn.setOnClickListener( v -> Log.e("initListener","onClick"));
3.语法介绍
基本的形式(参数) -> {表达式}其中符号->是不变的参数的变化情况:
- 无参数
() -> 表达式 - 单一参数
param -> 表达式(能自动推导参数类型,可省略()括号) 非单一参数
(param1,param2) -> 表达式(能自动推导参数类型)
(int param1,int param2) -> 表达式(不能自动推导参数类型 需要在参数前面加参数类型)表达式的变化情况:
空表达式
param -> {}- 单行表达式
param -> 表达式(可忽略{}括号,返回表达式也可以省略return) - 非单行表达式
param -> {表达式1;表达式2;}(表达式可以是return语句)
自定义两个参数的点击事件
public interface onClickListener{ void onClick(View view,int position);}private onClickListener onClickListener;public void setOnClickListener(onClickListener onClickListener) { this.onClickListener = onClickListener;}lambda表达式写法setOnClickListener((v,position) -> Log.e("自定义的Listener",position+""));
再比如说这个例子
List<Integer> list = new ArrayList<>();//匿名内部类形式Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer a, Integer b) { return a-b; } });//Lambda写法Collections.sort(list, (a, b) -> a - b);
4. Functional Interface(函数式接口)
Comparator接口只有一个抽象方法需要实现,这样的接口在Java 8中称为函数式接口。在Java 8之后的源码中,这样的接口都会使用@FunctionalInterface这个注解去标注函数式接口就是只能有一个抽象方法是不包括default标记的方法(有默认实现)和Object中已有的方法。
5. 返回值
Lambda表达式除了可以作为参数,也可以作为变量赋值 View.OnClickListener clickListener = v -> Log.e("initListener", "onClick"); id_btn.setOnClickListener(clickListener);
6. 变量作用域
a是常量 不能被修改 ambda表达式可以直接访问外部变量而不需要加final,但这个变量不能够修改lambda表达式中的()中的参数名不能与外部变量同名int a = 1;id_btn.setOnClickListener(x -> Log.i("tag", String.valueOf(a)));lambda表达式的this是代表对应的外部类,而不代表匿名内部类本身匿名内部类的this就是代表该匿名内部类id_btn.setOnClickListener( view -> Log.e("initData", this.toString()));
7.Method References(方法引用)
List<Integer> list = new ArrayList<>();//Lambda基本表达式Collections.sort(list, (a, b) -> a.compareTo(b));//方法引用Collections.sort(list, Integer::compareTo);方法引用的基本形式就是:类名::方法名方法的()没什么意义,一般不写
- 对象::实例方法
- 类::静态方法
类型对象::实例方法
Integer::compareTo就属于类型对象::实例方法这种
8. Constructor References(构造方法引用)
表现形式类名::new创建一个接口public interface onEmpty<T>{ T isNull();}//判断是不是为nullprivate <T extends String>boolean isEmpty(onEmpty<T> viewEmpty){ return viewEmpty != null && viewEmpty.isNull() == null;}//匿名内部类写法isEmpty(new onEmpty<String>() { @Override public String isNull() { return new String(); }});//lambda表达式原始写法 isEmpty(() -> new String());//lambda构造方法写法isEmpty(String::new);
阅读全文
0 0
- Lambda表达式简单使用
- Java 8 之 lambda 表达式简单使用入门实例代码。
- Java 8 之 lambda 表达式简单使用入门实例代码
- 委托使用lambda表达式
- Lambda表达式的使用
- Lambda表达式委托使用
- 使用 lambda 表达式
- lambda表达式的使用
- Lambda表达式使用汇总
- lambda表达式的使用
- lambda表达式使用
- python lambda 表达式使用
- Lambda表达式的使用
- Lambda表达式的使用
- lambda表达式使用案例
- 使用Lambda 表达式
- 使用Lambda与不使用Lambda表达式
- lambda表达式简单sql语句
- LINUX学习笔记(九)
- 105 定积分复习:型一:计算;型二:证明
- 使用TensorFlow实现二分类
- linux终端ssh连接超时问题记录
- 最长震荡子序列
- Lambda表达式简单使用
- Vue 组件(上)
- wpf 加载gif
- Android时间滚轮(一)
- HttpWebRequest图片采集
- (转)洪小文:以科学的方式赤裸裸地剖析AI|混沌初开
- 三天
- nginx知识
- 在官网上下载eclipse