Java 8之lambda表达式(三)

前言

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

咱们继续了解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中你可以为接口提供静态方法了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux驱动个人学习

typeof关键字的作用

一、typeof详解: 前言:     typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常广泛。(其实这和C++的auto关键字和可以...

3215
来自专栏计算机视觉

Python 函数使用记录,join函数和os.path.join用法

1.join()函数 语法:‘sep’.join(seq) 参数说明: sep:分隔符。可以为空 seq:要连接的元素序列、字符串、元组、字典等 上面的语法即:...

41212
来自专栏鸿的学习笔记

python的函数

在python里的lambda表达式只能使用纯表达式,除非像pyspark那样重载了。

1122
来自专栏happyJared

Python中的is和==以及字符串驻留机制

  先了解下官方文档中关于 is 和 == 的概念。is 表示的是对象标示符(object identity),而 == 表示的是相等(equality);is...

871
来自专栏PHP在线

PHP5常用函数

PHP已经更新到很多个版本,最近用的比较多的要数PHP5。下面我们为大家总结了PHP5常用函数,以便大家将来实际编写代码中查看。 pathinfo返回文件路径的...

3903
来自专栏猿人谷

静态成员函数和非静态成员函数的区别?

一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针t...

2079
来自专栏我是业余自学C/C++的

redis_3.0.7_sds.c_sdscatlen()

1824
来自专栏AzMark

Python 学习之 def 函数

当我们定义了一个 function(),并不意味着我们要调用它,所以我们需要运行这个 function(),一个简单的办法就是在 input 框中输入 func...

972
来自专栏mathor

枚举+优化(7)——前缀和1

1597
来自专栏遊俠扎彪

C++中的字符数组、字符串、字符指针的一些笔记

1、sizeof会计算实际内存空间,strlen会计算C风格的字符串的实际字符数(不包括\0)。

18910

扫码关注云+社区