Java中Lambda表达式的进化之路
Lambda表达式的进化之路
为什么要使用Lambda表达式
- 可以简洁代码,提高代码的可读性
- 可以避免匿名内部类定义过多导致逻辑紊乱
- 在原先实现接口抽象方法的时候,需要通过定义一个实现接口的外部类来实现,后面变为定义内部静态类,然后变为用局部内部类实现,再后面变成了定义匿名内部类来实现,最后的最后,为了代码的更加简洁,推出了Lambda表达式,最终实现了用一行代码完成之前多行代码的效果
Lambda表达式的注意点
Lambda表达式实际上属于是函数式编程的概念,所以在使用的时候要知道是否属于函数式编程
Lambda表达式的实现依赖于接口和父类,所以必须有两者之一才能实现Lam表达式
Lambda表达式实现的接口中要求只有一个抽象方法,如果有多个抽象方法就无法使用Lambda表达式来编程
Lambda表达式即适用于无参方法,也适用于含参方法
Lambda表达式最早在JDK 8中开始出现,所以只有 JDK 8 以后的版本才支持
下面是Lambda表达式的实现过程
最开始使用的是定义外部实现类来完成接口
public class tt1 {
public static void main(String[] args) {
//用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
//这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
lover l1 = new lover();
l1.love();
}
}
//定义接口
interface ILove {
void love();
}
//外部实现类
class lover implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 1");
}
} //输出为:I love you lover ---> 1
开始使用静态内部类来实现
public class tt1 {
//静态内部类
static class lover2 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 2");
}
}
public static void main(String[] args) {
//用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
//这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
ILove l1 = new lover1();
l1.love();
//使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
ILove l2 = new lover2();
l2.love();
}
}
//定义一个函数式接口
interface ILove {
void love();
}
//外部实现类
class lover1 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 1");
}
} //输出为:I love you my lover ---> 1
// I love you my lover ---> 2
使用局部内部类使用
public class tt1 {
//静态内部类
static class lover2 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 2");
}
} public static void main(String[] args) { //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
//这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
ILove l1 = new lover1();
l1.love();
//使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
ILove l2 = new lover2();
l2.love(); //局部内部类
class lover3 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 3");
}
}
ILove l3 = new lover3();
l3.love(); }
}
//定义一个函数式接口
interface ILove {
void love();
}
//外部实现类
class lover1 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 1");
}
} //输出为:I love you my lover ---> 1
// I love you my lover ---> 2
// I love you my lover ---> 3
使用匿名内部类实现接口
public class tt1 {
//静态内部类
static class lover2 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 2");
}
} public static void main(String[] args) { //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
//这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
ILove l1 = new lover1();
l1.love();
//使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
ILove l2 = new lover2();
l2.love(); //局部内部类
class lover3 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 3");
}
}
ILove l3 = new lover3();
l3.love(); //使用内部匿名类
ILove l4 = new ILove() {
@Override
public void love() {
System.out.println("I love you my lover ---> 4");
}
}; }
}
//定义一个函数式接口
interface ILove {
void love();
}
//外部实现类
class lover1 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 1");
}
} //输出为:I love you my lover ---> 1
// I love you my lover ---> 2
// I love you my lover ---> 3
// I love you my lover ---> 4
最后使用Lambda表达式实现函数式接口
public class tt1 {
//静态内部类
static class lover2 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 2");
}
} public static void main(String[] args) { //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
//这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
ILove l1 = new lover1();
l1.love();
//使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
ILove l2 = new lover2();
l2.love(); //局部内部类
class lover3 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 3");
}
}
ILove l3 = new lover3();
l3.love(); //使用内部匿名类
ILove l4 = new ILove() {
@Override
public void love() {
System.out.println("I love you my lover ---> 4");
}
};
l4.love(); //使用Lambda表达式实现接口
ILove l5 = () ->{
System.out.println("I love you my lover ---> 5");
};
l5.love();
}
}
//定义一个函数式接口
interface ILove {
void love();
}
//外部实现类
class lover1 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 1");
}
} //输出为:
I love you my lover ---> 1
I love you my lover ---> 2
I love you my lover ---> 3
I love you my lover ---> 4
I love you my lover ---> 5
关于Lambda表达式的更加极致的简化(针对有参数的Lambda表达书)
- 简化数据类型 在Lambda表达式中可以将参数的数据类型省略,只留下一个数据名称。比较特殊的是如果有多个参数,省略的时候应该将所有参数的数据类型都省略,不然就全部不省略,而且需要用括号将参数包含在内。
- 省略括号 参照上一条,只有一个参数要求的时候才可以省略括号
- 省略花括号 在Lambda表达式中,只有当输出语句或者代码只有一行的时候可以省略花括号。假如有多条执行代码,还是需要用花括号将代码包含在内
Java中Lambda表达式的进化之路的更多相关文章
- Java中lambda表达式详解
原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...
- Java中Lambda表达式的使用
简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因 ...
- Java中Lambda表达式的使用(转)
https://www.cnblogs.com/franson-2016/p/5593080.html 简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖" ...
- 快速掌握Java中Lambda表达式的用法
Lambda表达式的作用: Lambda表达式的作用就是简化代码开发,让代码看起来更加简介.它是用来简化匿名内部类的.但是并不是所有的匿名内部类都能用Lambda表达式简化,Lambda表达式是有使用 ...
- Java中Lambda表达式的简单使用
Lambda表达式是Java SE 8中一个重要的新特性.你可以把 Lambda表达式 理解为是一段可以传递的代码 (将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格 ...
- Java中lambda(λ)表达式的语法
举一个排序的例子,我们传入代码来检查一个字符串是否比另一个字符串短.这里要计算: first.length() - second.length() first和second是什么?他们都是字符串.Ja ...
- 为什么Java中lambda表达式不能改变外部变量的值,也不能定义自己的同名的本地变量呢?
作者:blindpirate链接:https://www.zhihu.com/question/361639494/answer/948286842来源:知乎著作权归作者所有.商业转载请联系作者获得授 ...
- Java中Lambda表达式基础及使用详解
概述 Lambda 是JDK 8 的重要新特性.它允许把函数作为一个方法的参数(函数作为参数传递进方法中),使用 Lambda 表达式可以使代码变的更加简洁紧凑,使Java代码更加优雅. 标准格式 三 ...
- Java中lambda表达式学习
一.Lambda表达式的基础语法: Java8中引入了一个新的操作符"->"该操作符称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分为两部分: 左侧:L ...
随机推荐
- # Zombie Gunship Survival(僵尸炮艇生存)GG修改器修改教程
Zombie Gunship Survival(僵尸炮艇生存)GG修改器修改教程 1.修改伤害,打击范围,武器冷却时间,子弹容量 测试手机机型:华为畅享7 系统版本:Android7.0 是否ROOT ...
- 一起搞懂PHP的错误和异常(一)
在PHP的学习过程中,我们会接触到两个概念,一个是错误,一个是异常.啥玩意?他们不是一个东西嘛?如果接触过Java.C#之类的纯面向对象语言的同学,可能对异常是没有什么问题,毕竟所有的问题都可以try ...
- webpack learn4-1配置css单独分离打包
1 先安装extract-text-webpack-plugin npm i extract-text-webpack-plugin 2 配置webpack.config.js
- Linux系列(3) - ls
作用 ls:查询目录中内容 格式 ls [选项] [文件或目录] 选项 描述 -a 显示所有文件,包括隐藏文件.隐藏文件是.开头的 -l 显示详细信息:ls -l简写为ll,使用频率很高 -d 查看目 ...
- ubuntu中如何切换普通用户、root用户
1.打开Ubuntu,输入命令:su root,回车提示输入密码,输入密码后提示:认证失败. 2.给root用户设置密码: 命令:sudo passwd root 输入密码,并确认密码. 3.重新输入 ...
- 判断javaScript变量是Ojbect类型还是Array类型
JavaScript是弱类型的语言,所以对变量的类型并没有强制控制类型.所以声明的变量可能会成为其他类型的变量, 所以在使用中经常会去判断变量的实际类型. 对于一般的变量我们会使用typeof来判 ...
- python3.7发送邮件带附件
代码: 1 # -*- coding: utf-8 -*- 2 3 import smtplib, ssl 4 from email.mime.text import MIMEText 5 from ...
- MySQL、Redis、MongoDB网络抓包工具
简介 go-sniffer 可以抓包截取项目(MySQL.Redis.MongoDB)中的请求并解析成相应的语句,并格式化输出.类似于在之前的文章 MySQL抓包工具:MySQL Sniffer[转] ...
- Jmeter 压力测试学习8--断言
断言成功是不会显示的,失败会有提示. 登录断言 一.添加断言 登录->添加->断言->响应断言 二.执行,查看断言 登录配置的都是正确的用户名跟密码 如果响应断言中内容改为:&quo ...
- 踩坑系列《一》数据库建表权限 CREATE command denied to user for table
今天在表中用Navicat连接服务器上的mysql账号进行建表,报了个这样类似的错, CREATE command denied to user for table 是数据库权限设置的问题,所以无法进 ...