美文网首页java8的世界
Java 8之lambda表达式(三)

Java 8之lambda表达式(三)

作者: Kotyo | 来源:发表于2017-07-21 16:12 被阅读41次

    前言

    上一篇咱们了解了一下内容:
    ① 方法引用
    ② 构造器引用

    咱们继续了解lambda表达式的剩下内容。

    1.6 变量作用域

    通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如:

    public static void repeatMessage(String text,int count){
       Runnable r=()->{
        for(int i=0;i<count;i++){
          Sysout.out.println(text);
          Thread.yield();
        }
      };
      new Thead(r).start();
    }
    

    假设有以下调用:

    repeatMesage("Hello",1000);//在另一个线程中打印1000遍
    

    注意看lambda表达式中count和text并没有定义在lambda表达式中(它们是自由变量),而是方法repeatMessage的参数变量。

    注意:含有自由变量的代码块被称为“闭包(closure)”。内部类也会捕获闭合域中的值。在Java 8之前,内部类只允许访问final的局部变量。为了适应lambda表达式,这条规则也被放宽了。一个内部类可以访问任何有效的final局部变量---即任何值不会发生变化的变量。

    lambda表达式的方法体与嵌套代码块有着相同的作用域,因此它也适用同样的命名冲突和屏蔽规则。在lambda表达式中不允许声明一个与局部变量同名的参数或局部变量。

    Path first=Paths.get("/usr/bin");
    Comparator<String>comp=(first,second)->Integer.compare(first.length(),second.length());
    //错误:变量first已经被定义。
    

    在一个方法中,你不能有两个同名的局部变量。因此,你也不能再lambda表达式中引入这样的变量。

    1.7 默认方法

    接口中包含带有具体实现的方法称之为默认方法。
    如果一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名方法。该选择哪个呢?根据以下原则选择:
    ① 选择父类中的方法。如果一个父类提供了具体实现方法,那么接口中具有相同名称和参数的默认方法会被忽略。
    ② 接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了具有相同名称和参数类型的方法(不管该方法是否是默认方法),那么你必须通过覆盖该方法来解决冲突。

    1.8 接口中的静态方法

    在Java 8中你可以为接口提供静态方法了。

    相关文章

      网友评论

        本文标题:Java 8之lambda表达式(三)

        本文链接:https://www.haomeiwen.com/subject/cpiskxtx.html