Java8闭包

闭包在很多语言中都存在,例如C++,C#。闭包允许我们创建函数指针,并把它们作为参数传递,Java编程语言提供了接口的概念,接口中可以定义抽象方法,接口定义了API,并希望用户或者供应商来实现这些方法,很多时候并不是为一些接口创建独立的实现类,我们通过写一个匿名的内部类来写一个内联的接口实现,匿名内部类使用相当的广泛,匿名内部类最常见的场景就是事件处理器了,其次匿名内部类还被用于多线程中,写匿名内部类而不是创建Runable\Callable接口的实现类。

一个匿名内部类就是一个内联的给定接口的实现,这个实现类的对象作为参数传递给一个方法,然后这个方法将在内部调用传递过来的实现类的方法,这种接口叫做回调接口,这个方法叫做回调方法。

匿名内部类很多地方都在使用,在使用的同时存在一些问题

  1. 复杂

    这些类代码的层级看起来很乱很复杂,称作Vertical Problem

  2. 不能访问封装类的非final成员

    this关键字变得很迷惑,如果一个匿名类有一个与其封装类相同的成员名称,内部类会覆盖外部的成员变量,在这种情况下,外部成员在匿名类内部是不可见的,甚至不能通过this来访问。

    实例说明

        public void test() {
            String variable = "Outer Method Variable";
            new Thread(new Runnable() {
                String variable = "Runnable Class Member";
                public void run() {
                    String variable = "Run Method Variable";
                    System.out.println("->" + variable);
                    System.out.println("->" + this.variable);
               }
            }).start();
        }
    输出
        ->Run Method Variable
        ->Runnable Class Member 

    这个例子很好的说明了上面的两个问题,而Lambda表达式几乎解决上面的所有问题,我们讨论Lambda表达式之前,让我们来看看Functional Interfaces

  3. Funcational Interfaces

    一个只有单个方法的接口,这代表了这个方法的契约。

    The Single method cal exist in the form of multiple abstract methods that are inherited from superinterfaces.But in that case the inherited methods should logically represent a single method or it might redundantly declare a method that is provided by classes like Object,e.g.toString

    > interface Runnable{void run();}
    > interface Foo {boolean equals(Object obj);}
    > interface extends Foo{ int compare(String s1,String s2)}
    > interface Comparetor{
          boolean equals(Object obj);
          int compare(T t1,T t2);
       }
    
    > interface Foo( int m(); Object clone();

    大多数回调接口

时间: 2024-10-13 12:08:24

Java8闭包的相关文章

从 λ 演算看 JS 与 JAVA8 闭包

关于 λ 演算在这篇博客 λ表达式与邱奇数,JAVA lamda表达式实现 中做了一个初步的介绍,这次我们来看一些实际应用中的例子:闭包.闭包的知识点有很多,但核心概念就一个,从 λ 演算的角度看便是:自由变量的替换依赖于定义函数的上下文环境.也就是说上下文环境的改变会通过影响函数中的自由变量而直接影响函数的定义. 在 js 中闭包的使用非常多,js 的闭包基于函数作用域链,可被用来定义命名空间及进行变量逃逸,是 js 模块化的基础.但在 java 中用的相对较少,因为 java 的语法限制,从

Java8部分新特性的学习

Java8中的新特性 一.Lambda表达式 Lambda表达式可以理解为一种可传递的匿名函数:它没有名称,但又参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名:和匿名类类似的,它没有明确的名字 函数:Lambda函数不属于某个特定的类,但和方法一样都具有参数列表.函数主体.返回类型,还可以有抛出的异常列表 传递:Lambda表达式可以作为参数传递给方法或者存储在变量中. Lambda表达式的基本形式: (parameters)-> expression 或(paramete

java8 lambda表达式-语法

什么事lambda表达式,在百科的解释是 "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.Lambda表达式可以表示闭包(注意和数学传统意义上的不同). 在java中我理解是匿名类,或者参数表达式(带有参数的可执行的代码块). (Type1 param1, Type2 param2, ..., TypeN

屌丝就爱尝鲜头——java8初体验

Java8已经推出,让我们看看他的魅力.让我们看看他改变较大的部分. 一.java8概述 Java8是由Oracle(甲骨文)公司与2014年3月27日正式推出的.Java8同时推出有3套语言系统,分别是Java SE8.Java SE Emebbled 8.Java ME8. Java SE8较以往的系统增强的功能有: ①增强了对集合式操作语言--lambda表达式的支持,"Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演

Java8 Lambda表达式介绍

欢迎进入我的博客:blog.scarlettbai.com查看更多文章 Lambda表达式是Java8里的一个重要特性,发布这么久了,最近在学swift语言时发现了其中的闭包的概念其实跟Lambda表达式极其相似,于是今天整理一下Java8中的Lambda表达式,做个介绍. Lambda表达式其实就是提供Java编程中对于函数式编程的支持,在我们习惯了一切皆对象时,刚接触Lambda可能读起来比较费劲,但是习惯之后,其确实有助于代码的简洁,且在Python.swift等中都有类似于Lambda这

java8之lambda表达式(变量作用域)

通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 {     public static void main(String[] args) {         repeatMessage("Hello", 20);     }     public static void repeatMessage(String text,int count){         Runnable r = 

【Java学习笔记之三十一】详解Java8 lambda表达式

Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码.而定义行为最重要的那行代码,却混在中间不够突出.Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码.这样有时可读性更好,表达更清晰.在Java生态系统中,函数式表达与对面向对象的全面支持是个激动人心的进步.将进一步促进并行

3.使用闭包实现数据缓存

闭包: 闭包是指可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量).“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域).在PHP.Scala.Scheme.Common Lisp.Smalltalk.Groovy.JavaScript.Ruby. Python.Go.Lua.objective

java 8 closure 闭包

在functional programming 里面经常提及closure 闭包. 那么究竟闭包是一个什么东东? 让人如何难以理解呢? 1 闭包定义 closure is an instance of a function that can reference nonlocal variables of that function with no restrictions.这是闭包的英文定义.说实在这段定义确实很抽象让人难以理解. 然后我这里其实有两个点把这段定义具体化: 1.1. 闭包就是允许