爲什麼要用java8

爲什麼要用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是一種情懷了。那隻能說你根本不關心技術,已經落伍了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章