Java ----- Lambda表达式
Lambda 是希腊字母表中排名第十一位的 (λ )的英文名称Lambda
lambda表达式的重要特征:
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
好处:避免内部类定义过多,去掉了没有意义的代码,只留下了核心逻辑,使代码看起来更加简洁,
函数式接口的定义:任何接口如果只包含唯一一个抽象方法,那么它就是一个函数式接口,
//函数式接口 :只有一个抽象方法 public interface Runnable{ public abstract void run(); }
使用场景:对于函数式接口可以使用Lambda表达式来创建该接口对象
Lambda表达式:属于函数式编程,与在es6 中的 借助箭头函数简化函数的书写方法基本一致
箭头函数小例子:
Lambda简单小例子:
//一个简单的匿名函数 public class LambdaTest { public static void main(String[] args) { //匿名函数 ILambdaTest iNiming= new ILambdaTest() { @Override public void addLambda(String name, int age) { // TODO Auto-generated method stub System.out.println("我叫"+name+",今年"+age+"岁了"); } }; iNiming.addLambda("匿名类", 18); } //函数式接口,只有一个抽象方法 interface ILambdaTest{ abstract void addLambda(String name,int age); } //使用lambda 简化 //lambda 表达式 ILambdaTest iLambda = (String name,int age)->{ System.out.println("我叫"+name+",今年"+age+"岁了"); }; iLambda.addLambda("lambda", 8); } //也可以不写参数类型,不过要不写都不写 //lambda 表达式 ILambdaTest iLambda1 = (name, age)->{ System.out.println("我叫"+name+",今年"+age+"岁了"); }; iLambda1.addLambda("lambda", 8); //当只有一行代码时也可以不写大括号 //lambda 表达式 ILambdaTest iLambda1 = (name, age)->System.out.println("我叫"+name+",今年"+age+"岁了");; iLambda1.addLambda("lambda", 8);
运行一下
在多线程中的使用
new Thread(()->System.out.println("静态代理在线程中使用")).start();
Lambda 的推导:一般实现,静态内部类,局部内部类,匿名类,lambad 表达式
lambad 表达式可以简化匿名类
package com.obge.threadstu; public class LambdaStu { //2.使用静态内部类,实现接口 static class ImpLambda2 implements ILambda{ @Override public void iMethod() { System.out.println("第二种实现接口方式,使用静态内部类"); } } public static void main(String[] args) { //one、在另一个类中调用接口实现类的一般方式 ImpLambda impLambda = new ImpLambda(); impLambda.iMethod(); //two、调用静态内部类 ImpLambda2 impLambda2 = new ImpLambda2(); impLambda2.iMethod(); //3、在局部内部类中,实现接口 class ImpLambda3 implements ILambda{ @Override public void iMethod() { System.out.println("第三种实现接口方式,使用局部内部类"); } } //three、调用局部内部类 ImpLambda3 impLambda3 = new ImpLambda3(); impLambda3.iMethod(); //4、使用匿名内部类(没有类名称,必须借助接口或父类) ILambda iLambda1 = new ILambda(){ @Override public void iMethod() { System.out.println("第四种实现接口方式,使用匿名内部类"); } }; //four、调用匿名内部类 iLambda1.iMethod(); //5、lambda 简化匿名内部类 ILambda iLambda2 = () ->System.out.println("第五种实现接口方式,使用lambda 表达式"); //five、调用lambda 表达式 iLambda2.iMethod(); } } //函数式接口 interface ILambda{ void iMethod(); } //实现类 class ImpLambda implements ILambda{ @Override public void iMethod() { System.out.println("第一种实现接口方式"); } }