qq_37335168 2022-06-01 10:58 采纳率: 84%
浏览 35
已结题

把lambda表达式赋值给接口类型的变量

#下面为什么能够把lambda表达式赋值给接口类型的变量,难道是隐藏了什么让解释器来做?

public class JavaLambdaTester {
   public static void main(String args[]){
      JavaLambdaTester tester = new Java8Tester();
        /*用lambda表达式来表达接口方法的各种实现,实际上省略了new 接口实现类名{},看起来是将接口方法的实现 
赋值给了接口类型的对象,这实际上是匿名类的一种表达*/
      //形参可进行类型声明
      MathOperation addition = (int a, int b) -> a + b;
        
      // 形参也可不进行类型声明
      MathOperation subtraction = (a, b) -> a - b;
        
      //返回语句放在大括号
      MathOperation multiplication = (int a, int b) -> { return a * b; };
        
      // 没有大括号及返回语句,解释器会自动将表达式结果给调用者
      MathOperation division = (int a, int b) -> a / b;
        /*使用接口类型的对象直接代表lambda表达式所表示的函数,将它作为另一个函数的实参;
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));

        //将实现接口方法的lambda表达式赋值给接口对象
      // 形参不用声明类型,解释器会同一认定,单个形参可以不用括号
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);
        
      //单个形参用括号
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);
        //用接口类型的对象调用被实现的接口方法,方法的实现由lambda来表达,实际上是在执行lambda表达式;
      greetService1.sayMessage("Runoob");
      greetService2.sayMessage("Google");
   }
    
   interface MathOperation {
      int operation(int a, int b);
   }
    
   interface GreetingService {
      void sayMessage(String message);
   }
    
   private int operate(int a, int b, MathOperation mathOperation){
      return mathOperation.operation(a, b);
   }
}

  • 写回答

2条回答 默认 最新

  • zcl_1991 2022-06-01 11:42
    关注

    img

    必须 只有一个抽象接口,这个lambda表达式就是这个接口的抽象方法的实现,就跟匿名类一样

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月11日
  • 已采纳回答 6月3日
  • 创建了问题 6月1日

悬赏问题

  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作