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