为什么要用java8

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16414307/article/details/53811550

为什么要用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.简化匿名类写法

扫描二维码关注公众号,回复: 3110605 查看本文章
// 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是一种情怀了。那只能说你根本不关心技术,已经落伍了。

猜你喜欢

转载自blog.csdn.net/qq_16414307/article/details/53811550
今日推荐