• Java 匿名类和lambda表达式


    一、匿名内部类

    一个匿名内部类是一个没有名字的内部类。它将进一步定义一个内部类以及创建一个内部类的实例。

    内部类处理器可以使用匿名内部类进行代码简化。

     匿名内部类的语法如下所示:

    new SuperClassName/InterfaceName() {
     // Implement or override methods in superclass or interface
     // Other methods if necessary
    }

    Since an anonymous inner class is a special kind of inner class, it is treated like an inner class

    由于匿名内部类必须总是从一个父类继承或者实现一个接口,但是它不能有显式的extends或者implements子句。
    一个匿名内部类必须实现父类或者接口中的所有抽象方法
    一个匿名内部类总是使用它父类的无参构造方法来创建一个实例,如果一个匿名内部类实现一个接口,构造方法是Object()
    一个匿名内部类被编译成一个名为OuterClassName$n.class的类。如果外部类 Test 有两个匿名的内部类,它们将会被编译成Test$1.class 和Test$2.class.

    二、lambda表达式

    主要参考自:https://www.cnblogs.com/nnxud/p/9827704.html

    1、简介

    lambda表达式可以用于极大简化事件处理的代码编写。

    lambda表达式是Java8的新特征,可以被看作使用精简语法的匿名内部类。

     

    观察上面的lambda表达式发现引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符。

    它将Lambda分为以下两个部分
        左侧 : 指定Lambda表达式需要的参数列表
        右侧 : 制定了Lambda体,是抽象方法的实现逻辑,也既Lambda表达式要执行的功能

    2、特征

        可选类型声明 : 不需要声明参数类型,编译器可以统一识别参数值
        可选的参数圆括号 : 一个参数无需定义圆括号,但多个参数需要定义圆括号
        可选的大括号 : 如果主体包含了一个语句,就不需要使用大括号
        可选的返回关键字 : 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值

    3、语法

    先给出没有使用lambda表达式之前,使用匿名内部类的写法

    //匿名内部类的写法
    @Test
        public void test() {
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
            System.out.println("Hello Lambda!");        
                }
            };
            runnable.run();
        }

    语法格式一 : 无参,无返回值

    /**
       * 语法格式一:无参数,无返回值
       *        () -> System.out.println("Hello Lambda!");
       */
        @Test
        public void test1() {
            //“->”左边只有一个小括号,表示无参数,右边是Lambda体(就相当于实现了匿名内部类里面的方法了,(即就是一个可用的接口实现类了。))
        Runnable runnable = ()->System.out.println("Hello Lambda!");    
        runnable.run();
        }

    语法格式二 : Lambda需要一个参数,但是没有返回值

     public static void test2() {
            Consumer<String> consumer = (String str) -> System.out.println(str);
            consumer.accept("Hello Lambda!");
        }

    语法格式三 : 数据类型可以省略,因为可由编译器推断得出,称为"类型推断"

        public static void test3() {
            Consumer<String> consumer = (str) -> System.out.println(str);
            consumer.accept("Hello Lambda!");
        }

    语法格式四 : Lambda若需要一个参数时,参数的小括号可以省略

     public static void test4() {
            Consumer<String> consumer = str -> { System.out.println(str) ;};
            consumer.accept("Hello Lambda!");
        }

    语法格式五 : Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值

        public static void test5() {
            Comparator<Integer> com = (x, y) -> {
                System.out.println("this is comparator");
                return Integer.compare(x, y);
            };
            int compare = com.compare(100, 244);
            System.out.println(compare);
        }

    语法格式六 : 当Lambda体只有一条语句时,return与大括号若有,都可以省略

       public static void test6() {
            Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
            int compare = com.compare(100, 244);
            System.out.println(compare);
        }
  • 相关阅读:
    350 Intersection of Two Arrays II 两个数组的交集 II
    349 Intersection of Two Arrays 两个数组的交集
    347 Top K Frequent Elements 前K个高频元素
    345 Reverse Vowels of a String 反转字符串中的元音字母
    344 Reverse String 反转字符串
    343 Integer Break 整数拆分
    342 Power of Four 4的幂
    338 Counting Bits Bit位计数
    Java常见面试题之Forward和Redirect的区别
    字节、字、bit、byte的关系
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/11938074.html
Copyright © 2020-2023  润新知