zoukankan      html  css  js  c++  java
  • Lambda 表达式

    package lambda;
    
    /**
     * Created by ding on 2018-3-22.
     * Lambda表达式的目的就是为了简化接口式的匿名内部类,要使用Lamdba表达式前提是接口中只有一个抽象方法,这个接口被叫做函数式接口
     */
    public class LamdbaDemo {
        public static void main(String[] args) {
    
            //lambda 表达式语法
            //好处是:1.代码简洁 2.不会产生实现类的class文件
            IEat eat = ()->{System.out.println("eat orange");};
    
            //lambda 表达式语句块中只有一局代码市可以省略{}
            IEat eat = ()->System.out.println("eat orange");
            eat.eat();
            eat.defaultMethod();
    
            //带有参数的Lambda
            IEat eat = (thing , i )->{
                System.out.println("eat.."+ thing + ".." + i + "..斤" );
            };
            eat.eat("apple" , 10);
    
            //带有返回值的lambda
            IEat eat = (thing , i )->{
                System.out.println("eat.."+ thing + ".." + i + "..斤" );
                return "吃完了";
            };
            //带有返回值的lambda , 并且代码块只有一行代码时,return 都可以省略
            IEat eat = (thing , i ) -> thing + " 吃完了,吃了 " + i;
            System.out.println( eat.eat("apple" , 10));
    
            //参数中使用final关键字,可以用简单变量接受,也可以写全,
            //这种写发有个问题接口规定的thing 变量引用不能改变。但是我在lambda里仍然可以改变引用
              IEat eat = (thing , i ) -> {
                  thing = new String("22");
                  return thing;
              };
            //然而这种写法确实是:thing 引用不能改变, 并且必须i 变量要写全类型。
              IEat eat2 = (final String thing , int i ) -> {
                   thing = new String("22");//此处编译报错 Cannot assign a value to final variable 'thing'
                  return thing;
              };
              System.out.println( eat.eat("apple" , 10));
    
        }
    
    }
    
    //只有一个抽象方法的接口
    @FunctionalInterface
    interface IEat{
        public String eat(final String thing , int i );
    
      //jdk 1.8新增的
        default void defaultMethod(){
            System.out.println("接口中的dafault方法");
        }
      //jdk 1.8新增、
        static void staticMethod(){
          System.out.println("接口中的静态方法");
        }
    }
    
    
    //class EatImpl implements IEat{
    //    @Override
    //    public void eat() {
    //        System.out.println("eat apple");
    //    }
    //}

    特别注意:

    Comparator 类 虽然看上去有两个 抽象方法,但是equal 是object 的 所以不算,所以Comparator 可以使用lambda ,注意@FunctionalInterface 注解也是表明该类是函数式接口

     

    
    
  • 相关阅读:
    数据库访问性能优化--应用开发
    苹果终端wifi图标点亮慢和portal弹窗机制分析以及处理办法和建议
    蓝牙固件升级(OTA升级)原理设计
    C语言:内存字节对齐详解
    linux du与ls查看文件大小时的区别
    80211 组播速率及组播转单播
    视频帧、码流计算
    IEEE802.11数据帧在Linux上的抓取 80211格式转8023帧格式
    wifidog源码分析
    无线路由:关于WDS,Repeater等模式的说明
  • 原文地址:https://www.cnblogs.com/smallFishs/p/8621825.html
Copyright © 2011-2022 走看看