lambda的语法格式

  • Lambda表达式
  • 语法格式1:无参且无返回值
  • 语法格式2:有一个参数,无返回值
  • 语法格式3:有两个或者两个以上的参数,多条执行语句,有返回值
  • 使用场景
  • 函数式接口


Lambda表达式

语法格式1:无参且无返回值

public interface MyInterface
{
void testMethod();
}
MyInterface m=() ->{System.out.println("卡巴喇嘛");}
  • 注意:->{}中如果只有一句话,那么{}可以省略不写
  • Lambda表达式的本质上就是:接口的实现类的具体的对象

语法格式2:有一个参数,无返回值

public interface MyInterface
{
void testMethod(int num);
}
MyInterface m=x ->{System.out.println("卡巴喇嘛"+x);}
m.testMethod(10);
  • 注意:->{}中如果只有一句话,那么{}可以省略不写
  • 参数的类型可以省略:(num)可以根据接口的定义进行上下文的推断
  • 参数名字 x 是可以随便写的
  • 如果只有一个参数 ()也是可以省略的

语法格式3:有两个或者两个以上的参数,多条执行语句,有返回值

public interface MyInterface
{
  int  testMethod(int num1,int num2);
}
public interface MyInterface 
{
    public abstract int testMethod(int num1,int num2);
}
class Demo3{
    public static void main(String[] args) {
        MyInterface m = (x,y)-> 666;
        System.out.println( m.testMethod(1,2));
    }
}
  • (x,y)有多个参数的话,()不可以省略
  • 多个执行语句的时候,{}不可以省略
  • 如果只有一句返回值,那么return也可以省略

使用场景

  • Lambda表达式就是能省则省;
  • Lambda表达式的使用场景: 使用 Lamda表达式本质是new一个接口的实现类的具体的对象,但它所依赖的接口是有要求的,这个接口中只能有一个抽象方法。

函数式接口

我们把只有一个抽象方法的接口叫做函数式接口
一般可以在函数式接口前加入一个注解进行限制:@FunctionalInterface
用了函数式接口,再考虑用Lambda表达式来简化代码

@FunctionalInterface
public interface MyInterface
{
    public abstract int testMethod(int num1,int num2);
}

jdk内置四大函数接口:

  • 消费型接口:Consumer :void accept(T t)
  • 供给型接口:Supplier :T get()
  • 函数型接口:Function<T,R> :appy(T t)
  • 断定型接口(断言型接口):Predicate :boolean test(T t)
public interface SpendMoney
{
    void buy(double money);
}
class Test
    {
    public static void buySth(double money ,SpendMoney s){
        s.buy(money);
    }
    public static void main(String[] args)
    {
        buySth(4000, new SpendMoney()
        {
            @Override
            public void buy(double money)
            {
                System.out.println(money);
            }
        });
    }
}

利用内置接口改造

import java.util.function.Consumer;
//public interface SpendMoney
//{
//    void buy(double money);
//}
class Test
    {
    public static void buySth(double money , Consumer s){
        s.accept(money);
    }
    public static void main(String[] args)
    {
        buySth(4000, new Consumer<Double>()//泛型必须在创建对象的时候确定
        { 
            public void accept(Double money)
            {
                System.out.println(money);
            }
        });
    }
}
import java.util.function.Consumer;

//public interface SpendMoney
//{
//    void buy(double money);
//}
class Test
    {
    public static void buySth(double money , Consumer s){
        s.accept(money);
    }
    public static void main(String[] args)
    {
        buySth(4000, new Consumer<Double>()//泛型必须在创建对象的时候确定
        {
            public void accept(Double money)
            {```
                System.out.println(money);
            }
        });
        //->用Lambda表达式改造后如下所示
        buySth(4000,m -> System.out.println(m)  );

    }
}