我们知道 Java 的合法命名是以字母或下划线开头的字符串,当然,以前单个下划线 _ 也是一个合法的变量命名。但是自 Java 8 的第一个版本开始,单个下划线的变量名编译时会有警告

int _ = 99;

用 Java 8 编译时提示警告:

Test.java:2: warning: '_' used as an identifier

int _ = 99;

^

(use of '_' as an identifier might not be supported in releases after Java SE 8)

1 warning

这正是为 Java 9 作的预谋,以一个 LTS 版的 Java 8 作为过渡。因此,来到了 Java 9 后,单个下划线不再担当普通变量名的角色,变成了一个保留关键字,只说是另有任用。

先来看下 Java 9 中的单个下划线变量名编译时的错误提示

Test.java:2: error: as of release 9, '_' is a keyword, and may not be used as an identifier

int _ = 99;

^

1 error

到底单下划线会作为什么用途呢? 已发布的 Java 10 没有给出答案,正在演进中的 Java 11 也没有相关的信息。

于是我对单个下划线的保留功能的猜测,像 Scala 那样可能是要把 _ 用作匿名参数(或者叫做参数点位符)

List("a", "b")

.map(_.toUpperCase + "X")

.foreach(println(_))

1

2

3

List("a","b")

.map(_.toUpperCase+"X")

.foreach(println(_))

上面的 Scala 代码中,_ 代表遍历的元素本身,完整写法是

List("a", "b")

.map(e => e.toUpperCase + "X")

.foreach(e => println(e))

1

2

3

List("a","b")

.map(e=>e.toUpperCase+"X")

.foreach(e=>println(e))

Java 也有一个比 Scala 高级的地方,那就是方法引用。类似的用 Java 的方法引用改写上面的代码

List.of("a", "b")

.map(String::toUpperCase)

.foreach(System.out::println)

1

2

3

List.of("a","b")

.map(String::toUpperCase)

.foreach(System.out::println)

Java 的 Lambda 只能做到这样的了,它的方法引用容不得更多的转换操作。对于

e -> e.toUpperCase() + "X"

//或

e -> System.out.println(e.toSupperCase())

1

2

3

e->e.toUpperCase()+"X"

//或

e->System.out.println(e.toSupperCase())

凡是操作前的参数变化或操作后结果需变化的 Lambda  都无法转换成方法引用。

Groovy 也有类似 Scala 的 _ 用法,只是它用的变量名是 it, 它不完全是 Groovy 的关键字

["a", "b"].forEach {

println(it.toLowerCase())

}

1

2

3

["a","b"].forEach{

println(it.toLowerCase())

}

Scala 除了 Lambda 中用作点位符外,还能用在模式匹配中,类似于 switch..case 语句中的 default 部分。

java1.9关键字_对 Java 9 把单个下划线作为关键字的猜想相关推荐

  1. 【Java工具类】(1)—Java中驼峰与下划线相互转换

    Java工具类(1)-Java中驼峰与下划线相互转换 1.驼峰命名法 /** * 驼峰式命名法 */ public static String toCamelCase(String s) {if (s ...

  2. final关键字_深入分析Java中的final关键字

    Java中被final修饰的变量与普通变量有何区别?被final修饰的变量不可更改.被final修饰的方法不可重写是怎样做到的?带着疑问我们一点点拨开云雾. 一.final的内存定义及规则 对于fin ...

  3. java中变量 关键字_基于java的voliate关键字详解

    voliate关键字的作用: 一.内存可见性 基于缓存一致性协议,当用voliate关键字修饰的变量改动时,cpu会通知其他线程,缓存已被修改,需要更新缓存.这样每个线程都能获取到最新的变量值. 二. ...

  4. java正则表达式 字母数字下划线_字母数字下划线常用正则表达式

    1.由数字.26个英文字母或者下划线组成的字符串: ^[0-9a-zA-Z_]{1,}$ 2.非负整数(正整数 + 0 ): ^/d+$ 3. 正整数: ^[0-9]*[1-9][0-9]*$ 4.非 ...

  5. java数字分割的下划线_在Java中使用下划线分隔数的字面值的用法讲解

    在Java SE 7中新增了以二进制形式的字面值表示方式,你可以像使用十进制一样,方便地使用二进制形式的字面值来表示数值. 例如: // 一个8位的byte值: byte aByte = 0b1000 ...

  6. python怎么打下划线符号_详解 Python 中的下划线命名规则

    在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后--那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...

  7. 【Python】标识符 ( Python 标识符命名规则 - 强制性 | 内容限定 | 大小写敏感 | 非关键字 | Python 标识符命名规范 - 建议性 | 下划线命名法 | 英文字母全小写 )

    文章目录 一.Python 标识符 1.Python 标识符命名规则 ( 强制性 ) 2.Python 标识符命名规范 ( 建议性 ) 二.代码示例 1.内容限定代码示例 2.大小写敏感 3.非关键字 ...

  8. Python中单个下划线“ _”变量的用途是什么?

    这段代码中_ after for的含义是什么? if tbh.bag:n = 0for _ in tbh.bag.atom_set():n += 1 #1楼 下划线_在Python中被视为" ...

  9. Python中单个下划线“_”变量的目的是什么?

    在Python中,下划线_被视为" 我不关心 "或" 丢失 "变量 python解释器将最后一个表达式值存储到名为的特殊变量中_. >>> 1 ...

最新文章

  1. Oracle函数的定义
  2. Dart 2.2 发布,谷歌推出的结构化编程语言
  3. 为应用程序池 ''DefaultAppPool'' 提供服务的进程意外终止。进程 ID 是 ''xxx''问题的解决方法...
  4. 求a^b前n位和后n位
  5. centos下安装ruby,删除ruby
  6. 程序人生:32条软件开发的建议和教训,值得读一读!
  7. Laravel Eloquent关联模型查询设置查询条件与指定字段
  8. 洛谷1048 采药(01背包)
  9. 微博授权失败 redirect_uri_mismatch
  10. 时间的正则表达式验证
  11. 【Android开发】消息提示框与对话框-使用AlertDialog创建对话框
  12. 读论文:AlexNet
  13. vsftpd 配置-使用虚拟账户登录
  14. 倍加福二维码测试1-串口助手测试
  15. MySql适配人大金仓数据库
  16. 刻录linux-iso至u盘工具,ISO USB刻录工具ISO to USB burning tool V1.5 完美版
  17. Excel:数据转置
  18. mummer基因组共线性分析详解
  19. GLUE数据集介绍:RTE、MRPC、SST-2、QNLI、MNLI、QQP
  20. Linux裸机开发详解

热门文章

  1. mysql .pdb是什么文件_超详细讲解如何使用 pdb 在服务器上调试代码
  2. 作者:赵文明(1977-),男,中国科学院北京基因组研究所生命与健康大数据中心高级工程师...
  3. 作者:钱宇华(1976-),男,博士,山西大学计算智能与中文信息处理教育部重点实验室教授...
  4. 【数理统计】基础理论归纳
  5. 【数据结构与算法】二叉树基本算法锦集
  6. 光栅图形学算法基础其二 (裁剪算法)
  7. 【本人秃顶程序员】深入理解Java——ConcurrentHashMap源码的分析(JDK1.8)
  8. 计数原理,递推,求从左边能看到l个棒子,右边能看到r个棒子的方案数目
  9. 作业26-完成登录功能,用session记住用户名
  10. 如何在Linux上制作一个屏幕录像视频教程