08_Lambda表达式与匿名内部类的联系与区别

【简述】

Lambda表达式是匿名内部类的一种简化,因此它可以取代匿名内部类的作用。

【Lambda表达式与匿名内部类的 相同点

1.Lambda表达式和匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部类的成员变量(包括实力变量和类变量)

2.Lambda表达式创建的对象和匿名内部类创建的对象一样,都可以直接调用从接口中继承的默认方法。

【相同点的实例】

package com.Higgn.Lambda;

@FunctionalInterface
interface Displayable{
    public  void display();
    default int add(int a,int b){
        return a+b;
    }
}
class LambdaAndInner{
    private int age=10;
    private static String name="Higgin";
    public void test(){
        String book="《java编程思想》";
        Displayable dis=()->{
            //访问"effectively final"局部变量
            System.out.println("book局部变量为:"+book);
            //访问外部类的实力变量和类变量
            System.out.println("外部类的实例变量age:"+age);
            System.out.println("外部类的类变量name:"+name);
        };
        dis.display();
        //调用dis对象从接口中继承的add()方法
        System.out.println(dis.add(10, 20));
    }
}
public class TestDemo {
    public static void main(String[] args) {
        LambdaAndInner lai=new LambdaAndInner();
        lai.test();
    }
}

【运行结果】

【Lambda表达式与匿名内部类的 区别

1.匿名内部类可以为任意接口创建实例——不管有多少个抽象方法,只要匿名内部类实现了所有方法即可。

但是Lambda表达式只能为函数式接口创建实例。

2.匿名内部类可以为抽象类甚至普通类创创建实例,

但lambda表达式只能为函数式接口创建实例。

3.匿名内部类实现的抽象方法体允许调用接口中的默认方法,

但Lambda表达式的代码块不允许调用接口中的默认方法。

时间: 2024-10-07 10:20:17

08_Lambda表达式与匿名内部类的联系与区别的相关文章

lamada表达式和匿名内部类的区别

Lambda表达式和匿名内部类的区别所需类型不同 ●匿名内部类:可以是接口,也可以是抽象类,还可以是具体类 ●Lambda表达式:只能是接口使用限制不同 ●如果接口中有且仅有一一个抽象方法,可以使用L ambda表达式,也可以使用匿名内部类 ●如果接口中多 于一个抽象方法,只能使用匿名内部类,而不能使用L ambda表达式实现原理不同 ●匿名内部类:编译之后,产生-一个单独的.class字节码文件 ●Lambda表达式:编译之后,没有一个单独的.class字节码文件.对应的字节码会在运行的时候动

Lambda01 编程范式、lambda表达式与匿名内部类、lambda表达式的写法

1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算机要做什么,不指定具体怎么做 1.3 函数式编程 跟声明式编程类似,就是告诉计算机做什么,不指定具体怎么做 参考博文 1.4 demo实例 1.4.1 需求 随机产生一个int类型的数组,分别利用命令式编程和函数值编程获取数组中的最小值 1.4.2 思路 命令式编程: 随记产生int类型数组 ->

OGNL表达式语言中的"#"和"$"的区别

Struts2使用标准的Context来进行OGNL表达式语言求值,OGNL的顶级对象是一个Context,这个Context对象就是一个Map类型实例,其根对象就是ValueStack,如果需要访问ValueStack里的属性,直接通过如下方式即可:    //取得ValueStack中bar属性    ${bar}除此之外,Struts2还提供了一些命名对象,但是这些命名对象都不是Stack Context的跟对象,它们只是存在于StackValue中.所以访问这些对象时需要使用“#”前缀来

Lambda表达式和匿名内部类

例1:无参函数的简写 如果需要新建一个线程,一种常见的写法是这样: // JDK7 匿名内部类写法 new Thread(new Runnable(){// 接口名 @Override public void run(){// 方法名 System.out.println("Thread run()"); } }).start(); 上述代码给Tread类传递了一个匿名的Runnable对象,重载Runnable接口的run()方法来实现相应逻辑.这是JDK7以及之前的常见写法.匿名内

Java8新增的Lambda表达式

Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简单的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例. 5.8.1 Lambda 表达式入门 Command.java package code; public interface Command { // 接口里定义的process()方法用于封装"处理行为" void process(int[] target); } ProcessArray.java package code; publi

Lambda 表达式 in java 8

Lambda 表达式 in Java 8 Lambda表达式是java 8 新增的特性 Lambda表达式主要作用:支持将代码块作为方法参数,允许使用更简洁的代码创建函数式接口的实例,是匿名内部类的一种简化,可以部分取代匿名内部类的作用. 函数式接口:只有一个抽象方法的接口. Lambda表达式又称为匿名函数(anonymous function),表示一类无需定义标识符(函数名)的函数或者子程序,可以看做是一种语法糖. Lambda 表达式语法格式 Lambda表达式在java中由三部分组成:

2、面向对象

三大特性: 1.多态:方法的重载(同一类中方法名相同,参数列表不同).重写/覆盖(父子中,方法名.形参列表相同,子类返回值类型比父类返回值类型相等或者更小,子类的访问权限应              比父类的更大或相等) 2.继承:extends,代码复用 3.封装:隐藏类的内部属性和实现,对外提供公共访问方式,外界通过setter.getter(setAbc对应abc)方法访问. 匿名对象:调用一次的时候使用 new Person().eat(); 构造方法:初始化对象的时候调用,没有系统会提

参考《Java疯狂讲义》

参考<Java疯狂讲义>Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例 1. Lambda表达式入门 下面先使用匿名内部类来改写(6.6介绍的命令模式Command表达式的例子) public class CommandTest{ public static void main(String[] args) { ProcessArray pa = new ProcessArray(); int[]

疯狂Java讲义(第4版) PDF 电子书 百度云 网盘下载

java电子书推荐理由:1)作者提供用于学习和交流的配套网站及作者亲自在线的答疑微信群.QQ群. 2)DVD光盘中含 1500分钟图书部分内容的相关视频 图书配套代码 Java面试题真题 PPT课件 设计模式电子书 有助于完成课后练习的大量完整案例 3)<疯狂Java讲义>历时十年沉淀,现已升级到第4版,经过无数Java学习者的反复验证,被包括北京大学在内的大量985.211高校的优秀教师引荐为参考资料.选作教材. 4)<疯狂Java讲义>曾翻译为中文繁体字版,在宝岛台湾上市发行.