Lambda表达式

Lambda表达式的基本结构:

(param1,param2,param3) -> { body }
(type1 param1,type2 param2, type3 param3) -> { body }

type是类型声明,编译器可以根据上下文推断参数的类型,如果可以推断出,则可以不加,加上是为了代码的可读性

一个Lambda表达式可以有0个或多个参数
参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
所有参数包含在圆括号内,参数之间用逗号相隔。例如:(a,b)或(int a,int b)或(String a,int b,float c)。
空圆括号代表参数集为空。例如:() ->42 表示参数为空,返回值42
当只有一个参数,且其类型可推导时,圆括号()可以省略。例如:a -> {return a * a;}
Lambda表达式的主体可包含0条或多条语句
如果Lambda表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
如果Lambda表达式的主体包含一条以上语句,则表达式必须包含在{}中。匿名函数返回类型与代码块返回类型一直,若没有返回则为空

Java Lambda表达式是一种匿名函数;它是没有声明的方法,即没有访问修饰符,返回值声明和名字
Lambda表达式作用:

  • 传递行为,而不仅仅是值
  • 提升抽象层次
  • API重用性更好
  • 更加灵活

函数式接口:

  • 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
  • 如果我们在某个接口上声明了FunctionalInterface注解,那么编译器就会按照函数式接口的定义来要求该接口
  • 如果某个接口只有一个抽象方法,但我们并没有给该接口声明FunctionalInterface注解,那么编译器依旧会将该接口看做是函数式接口
  • 如果某个接口中定义了一个抽象方法,而这个抽象方法重写了Object类中的pulbic 方法,那么该方法并不会增加该接口的抽象方法个数
  • 函数式接口的实例创建可以通过Lambda表达式、方法引用以及构造方法引用
@FunctionalInterface
public interface MyInterface {
   	   void test();
     	   String toString();
       }

如上述示例,加上FunctionalInterface注解不会报错,说明编译器认为该接口是一个函数式接口,因为toString 方法是重写的Object类中的方法,并不会增加该接口中抽象方法的个数

@FunctionalInterface
interface MyInter{
    void printInfo();
}
public class MyTest1 {
    public void execInfo(MyInter inter){
        System.out.println("-------------");
        inter.printInfo();
        System.out.println("-------------");
    }
    public static void main(String[] args) {
        MyTest1 test1 = new MyTest1();
        test1.execInfo(() -> {
            System.out.println("exec myinter ......");
        }) ;
        MyInter inter = () -> {
            System.out.println("exec myinter ......");
        };
    }
}

在Java中,Lambda表达式是对象,他们必须依附于一类特别的对象类型----函数式接口(functional interface),在其他语言中,Lambda表达式的类型是函数。

Cosumer函数式接口,除了默认方法外,只有一个accpt方法,接受一个参数,以下代码中两种写法结果是一样的。

public class MyTest2 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("hello","world","hello world");

        //Lambda表达式形式
    list.forEach(temp -> {
            System.out.println(temp.toUpperCase());
        });
      
        //匿名内部类方式
     list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s.toUpperCase());
            }
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值