为什么要用java8
很多人,觉得java6,甚至java5都足够用了,何必用高版本呢?高版本,还可能不稳定。
实际上,只要有可能就应该尽量使用最新稳定版本,看看使用java8的几个重要理由。
1. switch中增加对String类型的支持。
这个虽然java7就支持了,但是对于还在使用java6的,这也是升级到java8的重要理由。
这个不用举例,一说就清楚了。
2.try-with-resources语句 (同样java7就开始支持)
你觉得java6资源关闭很清爽吗?
OutputStream out = null;
try {
out = new FileOutputStream("");
// ...操作流代码
out.Close();
} catch (IOException e) {
//异常
}
抱歉,这段代码不合格!正确写法至少要这样
OutputStream out = null;
try {
out = new FileOutputStream("");
// ...操作流代码
} catch (IOException e) {
//异常
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
//关闭出错了
}
}
有没有被搞死的感觉? java7+中简化成这样
try (FileOutputStream out = new FileOutputStream("")) {
//处理代码
} catch (IOException e) {
//异常处理
}
java会对try中资源自动关闭,只要对象支持自动关闭接口(Closeable)。
3.lambda表达式与方法引用与stream
这些都是java8才有的重要更新,举几个简单例子
a.简化匿名类写法
// JDK7 匿名内部类写法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("OK");
}
}).start();
我们就是生成一个线程,打印一个OK,这种写法比另外定义一个类,要强多了,但是还不够简洁。
java8中简化成这样:
new Thread(() -> System.out.println("OK")).start();
所想就是所写。这个线程要打印,就只一行打印。
b.替代循环
for(C o : A){
o.out();
}
看起来还是很清爽的,java8:
//对于每个类型C成员o调用o.out()
A.forEach(C::out)
还有其他简写
//对于每个成员o调用静态方法C.staticFunc(o)
A.forEach(C::staticFunc)
//对于每个成员o调用otherObj.Func(o)
A.forEach(otherObj::Func)
//使用C的构造方法来生成对象
Stream.generate(C::new);
//这里看出,java,C#中,构造方法用与类同名的方法,的确不如类似VB.NET这样用关键字new来作为构造方法名更完美
当然不用方法引用时,可实现更复杂的逻辑
A.stream()
.filter(o->o.i>100)
.mapToInt(o -> o.i*o.i)
.sum()
对于o.i>100的,累加o.i平方,当然这个用循环写 :
int n=0;
for(C o:A){
if(o.i>100) n+=o.i*o.i
}
看起来也足够简洁,不过stream可以简单的扩展成并行执行,如果有足够多数据,在多cpu系统,只需很简单的调整为
A.parallelStream()
.filter(o->o.i>100)
.mapToInt(o -> o.i*o.i)
.sum()
c.Nashorn JavaScript引擎
这一引进,让java拥有了一个方便的脚本语言
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName( "JavaScript" );
System.out.println( "Result:" + engine.eval( "function f() { return 1; }; f() + 1;" ) );
用起来就这么简单,你可以在自己java系统里,方便的使用js脚本来做一些高级的事情,比如定义公式,自定义处理等等。
4.java8与spring4.1
spring本身大量的使用了回调的方式来处理,而spring4也针对了java8做了优化,完全支持在java8中使用。
经典的springjdbc
jdbcTemplate.query("SELECT * from t", new RowMapper<Product>(){
@Override
public Product mapRow(ResultSet rs, int rowNum) throws SQLException {
Integer id = rs.getInt("id");
Product product = new Product();
product.setId(id);
return product;
}});
修改成lambda表达式更清晰
jdbcTemplate.query("SELECT * from t", (rs, rowNum) -> {
Integer id = rs.getInt("id");
Product product = new Product();
product.setId(id);
return product;});
java8引入的Optional,spring4.1也很好的支持了
@Autowired
Optional<OtherService> otherService;
//类似于
@Autowired(required=false)
OtherService otherService;
这个注入就是不必须的,那么使用者可以利用Optional来防止null引用。更规范,不易出错。
同样对于springmvc中的请求参数注入也可以支持
@RequestMapping()
void f(@RequestParam Optional<Integer> id, int n)
其中第一个参数id就是可选的,而第二个参数n如果不提供,springmvc则会直接报错的。
方法参数名反射问题
java8,增加了编译时–parameters参数,可以避免再使用-debug方式来获得方法的参数名,这对于大量使用反射的spring来说,更加方便了。
总结
上面提到的都是笔者认为相对常用比较重要的理由,并非全部java8的改进。
不要再得意洋洋的认为自己坚持用java6,spring2是一种情怀了。那只能说你根本不关心技术,已经落伍了。