目录
前言
-parameters
为什么想写这篇博客,起因是被-parameters参数坑了一把。
Java 8 可以使用反射API和Parameter.getName()方法获得方法参数的名字,并且参数名可以保存在字节码里,通过Java编译命令javac的-parameters参数。
不过万万没想到parameters参数居然是默认关闭的,因为这个问题让我纳闷了很久。
保留参数名这一选项的编译开关都是javac -parameters
开了就可以得到正确的参数名,不开只能得到无意义的arg0 arg1 ……
因为我项目是基于Maven的,为了可移植性,选择将-parameters参数添加到maven-complier-plugin的配置部分。
偶对了,compiler插件是用于编译 Java 源文件的。
如果你的Maven版本<3.6.2:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
如果>=3.6.2
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<parameters>true</parameters>
</configuration>
</plugin>
我是不太想直接在IDEA里设置的,毕竟不是每个项目都有这种小众的需求。
既然解决了这个坑,那顺便再回顾一下Java增加的特性吧。
也不能称之为新的了,Java8不新了
但是大家为什么津津乐道Java8的新特性,因为Java8是Java5发布以来最大的一次版本升级。
1. Lambda表达式和函数式接口
1.1 介绍
Lambda表达式——闭包,允许我们将一个函数当作方法的参数。
主要使用lambda表达式来简化匿名内部类的书写(并不能取代所有)
//编译器会根据上下文推测参数的类型
Arrays.asList("H","e","l").forEach(e->System.out.print(e));
//也可以显示指定
Arrays.asList("H","e","l").forEach((String e)->System.out.print(e));
Lambda表达式可能会引用类的成员变量或者局部变量(会被隐式转变为final类型)
String s = "hhh"; //这里其实相当于final String s
Arrays.asList("Alice","Bob","Cindy").forEach(
e -> System.out.println(e+s)
);
Lambda表达式可能会有返回值,编译器会根据上下文推断返回值的类型。如果lambda的语句块只有一行,不需要return关键字。下面两个写法是等价的:
Arrays.asList("Alice","Bob","Cindy").sort(