目录

Lambda 表达式简介

Lambda 表达式

Lambda 语法精简

Lambda 方法引用

Lambda 构造方法引用

Lambda 综合练习


Lambda 表达式简介

【什么是Lambda】

Lambda是Java 8添加的一个新特性。说白了,Lambda就是一个匿名函数

【为什么要使用Lambda】

使用Lambda表达式可以对一个接口进行非常简洁的实现

【Lambda对接口的要求】

虽然可以使用Lambda表达式对某些接口进行简单的实现,但是并不是所有的接口都可以用Lambda表达式来实现。要求接口中定义的必须要实现的抽象方法只能是一个

@FunctionInterface标记

Lambda 表达式

Lambda是一个匿名函数,主要由:【参数列表】和【方法体】组成
【格式】

  • (): 用来描述参数列表
  • {}: 用来描述方法体
  • ->: lambda运算符,读作goes to
import interfaces.LambdaNoneReturnMutipleParameter;
import interfaces.LambdaNoneReturnNoneParameter;
import interfaces.LambdaNoneReturnSingleParameter;
import interfaces.LambdaSingleReturnMutipleParameter;
import interfaces.LambdaSingleReturnNoneParameter;
import interfaces.LambdaSingleReturnSingleParameter;/** * @ClassName: LambdaTest* @description: lambda测试* @author: FFIDEAL* @Date: 2020年3月2日 下午10:10:11*/public class LambdaTest {public static void main(String[] args) {//1.lambda表达式的基本语法//Lambda是一个匿名函数//参数列表  方法体//(): 用来描述参数列表//{}: 用来描述方法体//->: lambda运算符,读作goes to//无参数无返回值的LambdaNoneReturnNoneParameter lambdatest1 = () -> {System.out.println("hello world");};lambdatest1.test();//一个参数无返回值LambdaNoneReturnSingleParameter lambdatest2 = (int a) -> {System.out.println(a);};lambdatest2.test(20);//多个参数无返回值LambdaNoneReturnMutipleParameter lambdatest3 = (int a, int b) ->{System.out.println(a + b);};lambdatest3.test(20, 30);//无参数有返回值LambdaSingleReturnNoneParameter lambdatest4 = () -> {return 60;};System.out.println(lambdatest4.test());//有返回值单个参数LambdaSingleReturnSingleParameter lambdatest5 = (int a) -> {return a;};System.out.println(lambdatest5.test(70));//有返回值多个参数LambdaSingleReturnMutipleParameter lambdatest6 = (int a,int b) -> {return a + b;};System.out.println(lambdatest6.test(30, 50));}
}
/*** @ClassName: Createlambda* @description: 三种实现接口的方法,其中重点是lambda表达式,这种方法更简洁* @author: FFIDEAL* @Date: 2020年3月2日 下午9:32:28*/public class Createlambda {public static void main(String[] args) {// 1.通过接口实现类的方式Compare compare = new MyCompare();// 2.使用匿名内部类的方式Compare compare1 = new Compare() {@Overridepublic int compare(int a, int b) {// TODO Auto-generated method stubreturn a - b;}};// 3.使用lambda表达式的方式实现接口Compare compare2 = (a, b) -> a - b;}
}//创建一个实现接口的类
class MyCompare implements Compare {@Override// 重写Compare接口中的方法public int compare(int a, int b) {return a - b;}
}@FunctionalInterface
//上面注释是检查接口中是否只有一个方法:函数式接口
interface Compare {// 创建一个接口int compare(int a, int b);
}

Lambda 语法精简

语法精简的四条规则

  1. 参数类型。因为在接口中的抽象方法已经确定了参数类型,所以此时不用写参数类型
            注意:要省略参数类型就一起省略,不能出现有的省略,有的不省略的情况
  2. 当只有一个参数的时候,可以省略括号
  3. 当方法体中只有一条语句时,可以去掉大括号
  4. 当方体中只有一条返回语句且去掉大括号时,需同时把return去掉
import interfaces.LambdaNoneReturnMutipleParameter;
import interfaces.LambdaNoneReturnSingleParameter;
import interfaces.LambdaSingleReturnSingleParameter;/** * @ClassName: LambdaClear* @description: Lambda语法精简* @author: FFIDEAL* @Date: 2020年3月3日 下午1:38:35*/public class LambdaClear {public static void main(String[] args) {//1.参数类型。因为在接口中的抽象方法已经确定了参数类型,所以此时不用写参数类型//注意:要省略参数类型就一起省略,不能出现有的省略有的不省略的情况LambdaNoneReturnMutipleParameter lc1 = (a , b) -> {System.out.println(a + b);};lc1.test(1, 2);//2.当只有一个参数的时候,可以省略括号LambdaNoneReturnSingleParameter lc2 = a -> {System.out.println(a);};lc2.test(4);//3.当方法体中只有一条语句时,可以去掉大括号LambdaNoneReturnSingleParameter lc3 = a -> System.out.println(a);lc3.test(5);//4.当方体中只有一条返回语句且去掉大括号时,需同时把return去掉LambdaSingleReturnSingleParameter lc4 = a -> a;System.out.println(lc4.test(6));}
}

Lambda 方法引用

方法引用的规则:

  1. 方法引用:可以快速的一个Lambda表达式的实现直线一个已经实现了的方法
  2. 语法:方法隶属者::方法名

注意:

  1. 返回数量和类型一定要和接口中定义的方法一致
  2. 返回值的类型一定要和接口中定义的方法一致
import interfaces.LambdaSingleReturnSingleParameter;/** * @ClassName: LambdaFunction* @description: 方法引用* @author: FFIDEAL* @Date: 2020年3月3日 下午2:06:54*/public class LambdaFunction {public static void main(String[] args) {/** 方法引用:* 可以快速的一个Lambda表达式的实现直线一个已经实现了的方法* 语法:方法隶属者::方法名* * 注意:* 1.返回数量和类型一定要和接口中定义的方法一致* 2.返回值的类型一定要和接口中定义的方法一致* */LambdaSingleReturnSingleParameter lf1 = a -> change(a) ;System.out.println(LambdaFunction.change(10));//方法引用:静态引用了change方法的实现LambdaSingleReturnSingleParameter lf2 = LambdaFunction::change;System.out.println(LambdaFunction.change(20));LambdaFunction lf = new LambdaFunction();//方法引用:非静态引用了goesTo方法的实现LambdaSingleReturnSingleParameter lf3 = a -> lf.goesTo(a);System.out.println(lf.goesTo(30));LambdaSingleReturnSingleParameter lf4 = lf :: goesTo;System.out.println(lf.goesTo(40));}//创建一个静态方法private static int change(int a) {return a * 12 ;}//创建一个非静态方法private int goesTo(int a) {return a * 21 ;}
}

Lambda 构造方法引用

/** * @ClassName: LambdaTest2* @description: 构造方法* @author: FFIDEAL* @Date: 2020年3月3日 下午2:54:11*/public class LambdaTest2 {public static void main(String[] args) {//构造方法的引用PersonCreater pc = Person4::new;Person4 a = pc.getPerson();PersonCreater2 pc2 = Person4 :: new;Person4 b = pc2.getPerson("张三", 5);}
}interface PersonCreater{Person4 getPerson();
}interface PersonCreater2{Person4 getPerson(String name,int age);
}

Lambda 综合练习

/** * @ClassName: Person* @description: * @author: FFIDEAL* @Date: 2020年3月3日 下午2:50:09*/public class Person4 {private String name;int age;public Person4(){System.out.println("运行了无参构造器");}public Person4(String name, int age) {this.name = name;this.age = age;System.out.println("运行了有参数构造器");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String toString() {return "name:" + name + "age: " + age ;}}

案例1:集合排序

import java.util.ArrayList;/** * @ClassName: LambdaList* @description: 集合排序。按年龄降序* @author: FFIDEAL* @Date: 2020年3月3日 下午3:08:49*/public class LambdaList {public static void main(String[] args) {ArrayList<Person4> list = new ArrayList<Person4>();list.add(new Person4("LiMing",20));list.add(new Person4("WangJin",22));list.add(new Person4("LiuDehua",21));list.sort((o1 , o2) -> o1.age - o2.age);System.out.println(list);}
}

案例2:TreeSet

import java.util.TreeSet;/** * @ClassName: LambdaSet* @description: Tree Set* @author: FFIDEAL* @Date: 2020年3月3日 下午3:27:06*/public class LambdaSet {public static void main(String[] args) {//使用Lambda表达式来实现Comparator接口,并实例化一个TreeSet对象TreeSet<Person4> ts = new TreeSet<Person4>((o1 , o2) -> o1.age - o2.age);ts.add(new Person4("LiMing",20));ts.add(new Person4("WangJin",22));ts.add(new Person4("LiuDehua",21));System.out.println(ts);}
}

案例3:删除符合条件的对象(removeIf)

import java.util.ArrayList;
import java.util.ListIterator;/** * @ClassName: LambdaDelete* @description: 删除集合中满足条件的语句* @author: FFIDEAL* @Date: 2020年3月3日 下午3:44:28*/public class LambdaDelete {public static void main(String[] args) {ArrayList<Person4> list = new ArrayList<Person4>();list.add(new Person4("LiMing",20));list.add(new Person4("WangJin",22));list.add(new Person4("LiuDehua",21));/*ListIterator<Person4> it = list.listIterator();while(it.hasNext()) {Person4 ele = it.next();if(ele.age > 21) {it.remove();}}System.out.println(list);*/list.removeIf(ele -> ele.age > 21);System.out.println(list);}
}

案例4:开辟一个线程,做一个线程的数字输出

/** * @ClassName: LambdaThread* @description: 开辟一条线程,做一个数字输出* @author: FFIDEAL* @Date: 2020年3月3日 下午3:57:13*/public class LambdaThread {public static void main(String[] args) {Thread t = new Thread(() -> {for(int i = 0; i < 100; i++) {System.out.println(i);}});t.start();}
}

【Java】6.8 Lambda学习相关推荐

  1. Java 8 - 06 Lambda 和方法引用实战

    文章目录 Pre 第 1 步:传递代码 第 2 步:使用匿名类 第 3 步:使用 Lambda 表达式 第 4 步:使用方法引用 Pre 前几篇文章,我们已经学习了行为参数化.匿名类.Lambda表达 ...

  2. Java 回调 (Callback) 接口学习使用

    文章目录 Java 回调 (Callback) 接口学习使用 1.什么是回调(Callback)? 2.Java代码示例 2.直接调用 3.接口调用 4.Lambda表达式 推荐看我的InfoQ地址, ...

  3. Java 8 函数式编程学习笔记

    Java 8 函数式编程学习笔记 @(JAVASE)[java8, 函数式编程, lambda] Java 8 函数式编程学习笔记 参考内容 Java 8中重要的函数接口 扩展函数接口 常用的流操作 ...

  4. Java 8 新增lambda表达式(-)

    2019独角兽企业重金招聘Python工程师标准>>> Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性 ...

  5. 【java】理解和运用Java中的Lambda

    1.概述 转载:理解和运用Java中的Lambda 前提 回想一下,JDK8是2014年发布正式版的,到现在为(2020-02-08)止已经过去了5年多.JDK8引入的两个比较强大的新特性是Lambd ...

  6. 2019年Java程序员的学习路线

    2019年Java程序员的学习路线 一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Java如何实现的平台无关 JVM还支持哪些语言(Kot ...

  7. 【Java】函数式编程学习笔记——Stream流

    学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1 (1)[Java]函数式编程学习笔记--Lambda表达式 (2)[Java]函数式编程学习笔 ...

  8. Java高并发编程学习(三)java.util.concurrent包

    简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...

  9. JAVA基础与高级学习笔记

    JAVA基础与高级学习笔记 /记录java基础与高级,除了较简单的内容,没有必要记录的没有记录外,其余的都记录了/ java初学者看这一篇就够了,全文 6万+ 字. JAVA基础 java会出现内存溢 ...

  10. java安装_在线学习Java编程的最佳方法

    java安装 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好消息是,您 ...

最新文章

  1. 比特币现金压力测试超越了24小时创造新纪录
  2. python 中的位置参数和默认参数
  3. 【转】ora-00031:session marked for kill处理oracle中杀不掉的锁
  4. python numpy np.convolve()函数(返回两个一维序列的离散线性卷积)
  5. WebAPI(part3)--事件基础
  6. Java 并发编程ReentrantLock--源码解析(底层AQS实现)
  7. CTS(4)---mtk cts FAIL处理方法
  8. mysql php 时间比较大小_mysql中日期大小比较实例
  9. Java序列化的这三个坑千万要小心
  10. QML学习【一】Basic Types
  11. 深度解析~iOS应用程序~生命周期
  12. react 把前后台的axios请求放在一起_可靠React组件设计的7个准则之SRP
  13. 【书籍推荐】《美国黒室》
  14. 例2.8 叠筐 - 九度教程第15题(排版题)
  15. 局域网屏幕共享_给安卓手机连一个大屏幕——多端协作(六)
  16. Python3 网络爬虫 <教程全集>
  17. dkp管理系统 php,RB!DKP v3.1.8 Build
  18. Sql Server数据库的备份和恢复措施
  19. min_25 JZOJ5594 最大真因数
  20. 机房消防报警系统及气体灭火防护的设计方法

热门文章

  1. 为什么说金融行业获客越来越难做,总结了一下,主要是以下几个点:
  2. 应遵循的PL/SQL编码规则 (作者:Steven Feuerstein)
  3. 2018软科中国【软件工程学科】最好学校排名
  4. 【Stateflow入门】任务7.构建扫地机器人
  5. LDSC:连锁不平衡回归分析
  6. Rocky(Centos)使用acme.sh申请安装Let‘s Encrypt泛域名ECC证书(阿里DNS)
  7. arguments.callee有什么用
  8. postgresql初始化数据库
  9. 少年游 过故人庄赋百越王生
  10. 如何快速的把所有蛋白质结构域信息爬取出来并保存到excel