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 注解也是表明该类是函数式接口

     

    
    
  • 相关阅读:
    CSS属性之定位
    CSS选择器区别
    HTML属性及其相关区别
    HTML标签区别
    HTML其他概念
    CSS3新特性
    HTML5新标签
    HTML5新特性
    params修饰符的用法
    C#中引用参数ref和输出参数out
  • 原文地址:https://www.cnblogs.com/smallFishs/p/8621825.html
Copyright © 2011-2022 走看看