在前面有一篇写到了Lambda表达式,现在可以给你们介绍什么是Lambda表达式

现在有很多老程序员都不喜欢这个函数式编程思想

  主要就一点 : 老程序员习惯了 面向过程 写程序,而Lambda表达式是 面向结果 不注重过程

那么Lambda有什么优点 :

  • 操作简单
  • 代码优化

缺点 :

  • 非常不易读

Lambda标准格式

Lambda省去面向对象的条条框框,格式由3个部分组成:

  • 一些参数

  • 一个箭头

  • 一段代码

Lambda表达式的标准格式为 : ( 参数类型 参数名称 ) -> { 代码语句 }

格式说明:

  • 小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。

  • ->是新引入的语法格式,代表指向动作。

  • 大括号内的语法与传统方法体要求基本一致。

Lambda的使用前提-函数式接口

Lambda的语法非常简洁,完全没有面向对象复杂的束缚。但是使用时有几个问题需要特别注意:

  1. 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。无论是JDK内置的RunnableComparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。

  2. 使用Lambda必须具有上下文推断。也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。

@FunctionalInterface注解

@Override注解的作用类似,Java 8中专门为函数式接口引入了一个新的注解:@FunctionalInterface。该注解可用于一个接口的定义上:

 @FunctionalInterface
public interface MyFunctionalInterface {
void myMethod();
}

一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样。

没有错Lambda表达式必须用在接口上并且此接口内有且只有一个抽象方法 才能够使用Lambda表达式

下面拿Runnable接口来演示 无参 写法

 /*
Lambda表达式的标准格式,由三部分组成:
1、一些参数
2、一个箭头→
3、一段代码
Lambda表达式格式:
( 参数列表 )->{ 重写的方法体代码 }
格式说明:
(): 接口中抽象方法的参数列表,没有参数就空着不写。有参数就写出参数,多少参数使用逗号分隔
->: 将参数列表中的参数,传递给方法体
{}:重写接口中抽象方法的具体代码。 */
public class LambdaDemo {
public static void main(String[] args) {
// 使用匿名内部类完成线程任务
new Thread(new Runnable() {
@Override // 线程任务 重写run方法
public void run() {
System.out.println("使用匿名内部类..完成多线程执行...");
}
}).start(); // 代码优化,使用Lambda表达式
new Thread( () -> {
System.out.println("使用匿名内部类..完成多线程执行...");
}
).start();
}
}

我们再拿 Arrays.sort(数组,Comparator接口) 来演示 有参 写法 (这个是对数组排序)

 // 演示有参有返回值 Lambda表达式
public class LambdaDemo {
public static void main(String[] args) {
Person[] ps = {
new Person("如来佛祖",90000),
new Person("观音菩萨",18),
new Person("孙悟空",700)
}; // 需求:将数组中的对象,按年龄从小到大的方式排序 // // 使用匿名内部类的方式完成
// Arrays.sort(ps, new Comparator<Person>() {
// @Override // 重写比较的方法,按年龄排序
// public int compare(Person o1, Person o2) {
// return o1.age - o2.age;
// }
// }); // 使用Lambda方式完成升序排列
Arrays.sort( ps , ( Person p1 , Person p2 ) -> {
return p1.age - p2.age;
}); // 打印排序后的数组
for( Person p : ps ) {
System.out.println( p );
}
}
}

Lambda省略格式

省略规则

在Lambda标准格式的基础上,使用省略写法的规则为:

  1. 小括号内参数的类型可以省略;

  2. 如果小括号内有且仅有一个参数,则小括号可以省略;

  3. 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。

我们来拿 Collections.sort(List集合,Comparator接口) 来演示 有参 写法 (这个是对List集合排序)

 public class lists{

     public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(5);
list.add(2);
list.add(3);
list.add(7);
for (Integer integer : list) {
System.out.print(integer+" ");
} System.out.println();
//按降序排列
Collections.sort(list,(o1,o2) ->o2 - o1);
for (Integer integer : list) {
System.out.print(integer+" ");
}
}
}

JavaSE Lambda表达式(JDK1.8新特性)的更多相关文章

  1. jdk1.8新特性之lambda表达式

    lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类的简化.在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了.但不是说lamb ...

  2. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  3. JDK1.8新特性之(一)--Lambda表达式

    近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...

  4. JDK1.8 新特性

    jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...

  5. jdk1.8新特性应用之Iterable

    我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback ...

  6. jdk1.8新特性之方法引用

    方法引用其实就是方法调用,符号是两个冒号::来表示,左边是对象或类,右边是方法.它其实就是lambda表达式的进一步简化.如果不使用lambda表达式,那么也就没必要用方法引用了.啥是lambda,参 ...

  7. JDK1.8新特性之(三)--函数式接口

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  8. JDK1.8新特性之(二)--方法引用

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  9. jdk1.6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

随机推荐

  1. C#中Equals()和= =(等于号)区别

    在这里,首先得告诉大家,在C#中,不管是 == ,还是 Equals() 我们都是可以重写的.所以,在具体选择使用两者时,还是得根据这两个方法的具体实现逻辑来选择. 值类型的比较 对于值类型来说,两者 ...

  2. 利用python同步windows和linux文件

    写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,然后再利用网络copy,重复性很大,就想着能不能写一个小脚本帮我同步 逻辑:比对本地和服务器文件的 ...

  3. EF6学习笔记(六续) 复杂数据模型建表测试

    测试以下几种模型关系: 1对1或0  . 1对多  . 多对多 1 对 1 或 0 如果直接定义两个模型,相互直接增加导航属性,会提示错误,必须为这个对应关系设定主副关系: public class ...

  4. idea集成tomcat

    1 Tomcat的使用 * Tomcat:web服务器软件 1. 下载:http://tomcat.apache.org/ 2. 安装:解压压缩包即可. * 注意:安装目录建议不要有中文和空格 3. ...

  5. TextView展示富文本时emoj或图片和文字不对齐的解决方案

    在项目中,回复框.聊天界面的显示往往会有emoj或者图片,但是一个比较头疼的问题是,会出现emoj表情或者图片和文字的位置不对齐,总是有偏移,这样很影响用户体验的.下面会总结一下如何解决这个问题. 本 ...

  6. Maven(个人整理)(一,未完待续)

                                                      Maven 1. 什么是Maven? 乍一看,Maven看起来很多东西,但简而言之,Maven试图将 ...

  7. Linux - history命令的常用方法

    history命令 打印所有命令记录:history 打印最近10条记录:history 10 执行第123条命令记录:!123 重复执行上一条命令:!! 执行最后一次以ls开头的命令:!ls 逐屏列 ...

  8. LeetCode:21_Merge Two Sorted Lists | 合并两个排序列表 | Easy

    题目:Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list sh ...

  9. spring boot 集成 thymeleaf

    例如meta标签,低版本标签必须要闭合,高版本不用这么严格. pom文件引入高版本jar包如下,propertis里添加:

  10. JavaScript中的 this全面解析

    上一章我们排除了一些对this的错误认识和知道了this是在调用函数时被绑定的,完全取决于函数的调用位置.先介绍两个概念:调用位置和调用栈. 调用栈:就是为了到达当前执行位置所调用的所有函数. 调用位 ...