一、Lambda表达式

1、Lamdba

Lambda 允许把函数作为一个方法的参数,使用Lamdba可以让开发的代码更加简洁,但是易读性差,新人不了解Lamdba表达式或者代码功底有点差,不容易读懂大佬们写的代码了。

2、Lamdba语法格式

(parameter1,parameter2.....) -> {expression;};

参数可以是多个,也可以是1个,也可以没有参数,expression 同样是多个,或者是1个,或者无表达式

简单例子:


  1. // TODO: 2018/11/19 申明数据类型
  2. NumberInterface addOperate = (int a,int b) -> a + b;//加
  3. // TODO: 2018/11/19 不申明数据类型
  4. NumberInterface subOperate = (a, b) -> a - b;//减
  5. // TODO: 2018/11/19 不申明返回语句
  6. NumberInterface mulOperate = (a,b) -> a * b; //乘
  7. // TODO: 2018/11/19 申明返回语句
  8. NumberInterface divOperate = (a,b) -> {//除
  9. return a / b;
  10. };
NumberInterface = (int a,int b) -> a + b;

这里我申明了一个函数,变量名为addOperate ,函数值等于(int a,int b)-> a + b;

3、NumberInterface

JDK8以后的接口方法可以有方法体。

a、JDK7以前的版本,修改定义的接口之后,需要修改全部实现该接口的类;

b、JDK8以后的版本,我们可以定义有方法体的method,这样可以兼容老版本的代码;

c、所以引进的默认方法,目的是为了解决接口的修改与现有的实现不兼容的问题。


  1. package com.cn.dl;
  2. /**
  3. * Created by Tiger on 2018/11/19.
  4. * JDK8以后的接口最大的区别就是方法可以有方法体,
  5. * 1、JDK7以前的版本,当需要修改接口时候,需要修改全部实现该接口的类
  6. * 2、JDK8以后的版本,我们可以定义有方法体的method,这样可以兼容以前版本的代码。
  7. * 3、所以引进的默认方法,目的是为了解决接口的修改与现有的实现不兼容的问题。
  8. */
  9. public interface NumberInterface {
  10. int numberOperate(int a,int b);
  11. // TODO: 2018/11/19 在接口中定义静态默认方法
  12. static int operate(int numberA,int numberB,NumberInterface nunberInterface){
  13. return nunberInterface.numberOperate(numberA,numberB);
  14. }
  15. // TODO: 2018/11/19 接口中定义默认方法
  16. default String getMessage(String message){
  17. return "interface"+message;
  18. };
  19. }

4、LambdaTest


  1. package com.cn.dl;
  2. /**
  3. * Created by Tiger on 2018/11/19.
  4. */
  5. public class LamdbaTest {
  6. public static void main(String[] args) {
  7. int numberA = 100;
  8. int numberB = 20;
  9. // TODO: 2018/11/19 申明数据类型
  10. NumberInterface addOperate = (int a,int b) -> a + b;//加
  11. // TODO: 2018/11/19 不申明数据类型
  12. NumberInterface subOperate = (a, b) -> a - b;//减
  13. // TODO: 2018/11/19 不申明返回语句
  14. NumberInterface mulOperate = (a,b) -> a * b; //乘
  15. // TODO: 2018/11/19 申明返回语句
  16. NumberInterface divOperate = (a,b) -> {//除
  17. return a / b;
  18. };
  19. System.out.println("add>>>"+NumberInterface.operate(numberA,numberB,addOperate));
  20. System.out.println("sub>>>"+NumberInterface.operate(numberA,numberB,subOperate));
  21. System.out.println("mul>>>"+NumberInterface.operate(numberA,numberB,mulOperate));
  22. System.out.println("div>>>"+NumberInterface.operate(numberA,numberB,divOperate));
  23. //调用NumberInterface中默认方法
  24. InterfaceTest interfaceTest = new InterfaceTest();
  25. System.out.println(interfaceTest.getMessage(" hello"));
  26. }
  27. }

5、结果


  1. add>>>120
  2. sub>>>80
  3. mul>>>2000
  4. div>>>5
  5. interface hello

6、总结

a、lambda表达式主要为了执行方法类型的接口,避免定义匿名方法,开发更加简洁;

b、lambda中使用外层的变量,不能在lamdba表达式中修改其值,外层变量可以不是final类型的,但是绝对不可以在lambda表达式中修改外层变量的值。(Variable used in lambda expression should be final or effectively final)

c、lambda不可以定义一个和外层变量名相同的变量,与变量类型无关。(variable ‘i’ is already defined in the scope)

7、其它测试类

a、InterfaceTest


  1. package com.cn.dl;
  2. /**
  3. * Created by Tiger on 2018/11/19.
  4. */
  5. public class InterfaceTest implements NumberInterface {
  6. // TODO: 2018/11/19 必须重写接口中申明的方法(没有方法体)
  7. @Override
  8. public int numberOperate(int a, int b) {
  9. return 0;
  10. }
  11. }

b、ThreadLamdbaTest


  1. package com.cn.dl;
  2. import java.util.concurrent.TimeUnit;
  3. /**
  4. * Created by Tiger on 2018/11/19.
  5. */
  6. public class ThreadLamdbaTest {
  7. public static void main(String[] args) {
  8. //普通写法
  9. new Thread(){
  10. public void run(){
  11. try {
  12. TimeUnit.SECONDS.sleep(10);
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. System.out.println("general thread");
  17. }
  18. }.start();
  19. System.out.println("general method");
  20. //lamdba写法
  21. new Thread(()->{
  22. try {
  23. TimeUnit.SECONDS.sleep(10);
  24. } catch (InterruptedException e) {
  25. e.printStackTrace();
  26. }
  27. System.out.println("lambda thread");
  28. }).start();
  29. System.out.println("lambda method");
  30. }
  31. }

原文地址:https://blog.csdn.net/qq_31289187/article/details/84258462

JDK8-lambda表达式以及接口可以定义默认方法的更多相关文章

  1. jdk8 lambda表达式总结

    Java8 lambda表达式10个示例   1. 实现Runnable线程案例 使用() -> {} 替代匿名类: //Before Java 8: new Thread(new Runnab ...

  2. jdk8 Lambda表达式与匿名内部类比较

    Labmda表达式与匿名内部类 前言 Java Labmda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖, ...

  3. JDK8.0接口中的默认方法和静态方法

    我们在接口中通常定义的方法是抽象方法,即没有方法体,只有返回值类型和方法名:(public abstract) void Method(); 类在实现接口的时候必须重写抽象方法才可以 jdk8中新加的 ...

  4. 接口的定义——默认加public abstract默认全局常量;与继承不同,子类可以同时实现多个接口;抽象类实现接口;接口继承接口

    一. 接口的定义 接口中定义的方法,全部都为抽象方法,默认加public abstract 接口中定义的变量,全部为全局常量,默认加public static final 二.与继承不同,子类可以同时 ...

  5. Java8新特性_接口中的默认方法

    默认方法由来猜想 1. Collection接口.Collections公共类.  同是操作集合,为啥要搞俩?没必要.在接口中搞一些默认实现,一个接口即搞定了. 2. Java8支持Lambda表达式 ...

  6. Java 8 接口中的默认方法与静态方法

    Java 8 接口中的默认方法与静态方法 1. 接口中的默认方法 允许接口中包含具有具体实现的方法,该方法称"默认方法",默认方法使用用 default 关键字修饰. public ...

  7. Java8接口中的默认方法

    Java8新增特性,可以为接口中添加默认方法,实现这个接口的所有类都会继承这个方法,这样看起来,接口和类的界限就有点不明显了,同时也会带来多继承,菱形问题.这样设计的初衷是什么? 重所周知,java8 ...

  8. Java8新特性Optional、接口中的默认方法与静态方法

    Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...

  9. Java自学-接口与继承 默认方法

    默认方法 步骤 1 : 什么是默认方法 默认方法是JDK8新特性,指的是接口也可以提供具体方法了,而不像以前,只能提供抽象方法 Mortal 这个接口,增加了一个默认方法 revive,这个方法有实现 ...

随机推荐

  1. CSS3 之书页阴影效果

    视觉如下: CSS3 之书页阴影效果: <html> <head> <meta charset="UTF-8"> <title>书页 ...

  2. 【BZOJ 1036】 树的统计count

    题目 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: ...

  3. 计算电脑所能表示的最大最小值(c++)

    C++当中获得现在计算机上所能表示的各种类型(比如int,long int,short int,double,float等)最大最小有两种方法,一种是使用c++预先定义的宏,对于有些编译器可能需要包含 ...

  4. <英狼>--团队作业3 王者光耀--终极版

    队员 陶俊宇_031702113 卞永亨_031702229 唐怡_031702109 Github 吉哈---King-Shines 队员输出百分比,数据为估值仅供参考 MVP:队长:陶俊宇 60% ...

  5. windows 共享文件夹

    windows 共享文件夹 同步工作组 右键单击"计算机",选择"属性" 更改设置 单击"更改". 输入工作组 和 主机名 启计算机使更改生 ...

  6. how does SELECT TOP works when no order by is specified?

    how does SELECT TOP works when no order by is specified? There is no guarantee which two rows you ge ...

  7. OTA升级常见问题

    OTA升级常见问题 问题现象:在进行 OTA 升级测试时,下载成功了升级包,在点击立即更新后,手机一直处于提示“正在更新中”,没能重启进行升级. 问题分析:经过分析发现,因为OTA 应用不具备系统权限 ...

  8. 清理收藏夹中的json

    1.json的字符串与对象转换 $.parseJson(str)与JSON.parse(str) 返回值是true.另:json对象和字符串的相互转换 JSON.stringify(obj) 将JSO ...

  9. axios与ajax的区别及中文用户指南

    Ajax: Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术. $.ajax({ ty ...

  10. (转)scipy详解

    原文:https://www.cnblogs.com/ws0751/p/8361353.html#top 登月图片消噪   scipy.fftpack模块用来计算快速傅里叶变换速度比传统傅里叶变换更快 ...