Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

2015/07/29

[廣告] Java SE 8懶人包(Java SE 8 for the Really Impatient)

嗨,我翻譯了一本書,在這裡打打廣告。

書名:Java SE 8懶人包
原書名:Java SE 8 for the Really Impatient
作者:Cay S. Horstmann,也是Java暢銷書《Core Java》的主要作者
譯者:我
出版社:博碩
出版日期:2015年7月30日
頁數:256


簡介

在上百萬名程式設計師的殷切期盼下,Java SE 8可說是近年來最重大的Java 改版。引進lambda 運算式(閉包)以及串流,為 Java 程式設計所帶來重大改變,毫不亞於當年泛型以及註文所造成的衝擊。

本書由國際知名的Java書籍作者Cay S. Horstmann為大家一一介紹Java 8最具價值的新功能,除此之外還包含一些不為人知、但卻相當重要的Java 7功能。如果你已是一位熟練的Java程式設計師,本書的實作能夠讓你快速瞭解Java語言及平台的新特性。

這本不可或缺的指南包含了:
  • 說明如何運用lambda運算式,撰寫可重複使用的程式碼片段。
  • 全新的串流 API,讓Java群集更加靈活且更具效率。
  • 藉由lambda 運算式(filter/map/reduce)進行並行運算,為共享計數器與雜湊表帶來顯著的效能提昇。
  • 利用完整一章來說明如何在程式中運用lambda運算式。
  • 說明備受期待且功能強大的date/time/calendar程式庫(JSR 310)。
  • 簡要說明JavaFX(Swing GUI的替代技術)和JavaScript引擎Nashorn。
  • 詳細介紹許多程式庫的細微變化,這些變化能夠讓 Java 程式設計更富生產力也更有樂趣。
本書率先涵蓋了所有這些備受期待的改進,並且能夠協助開發者撰寫出最健全、高效並且安全的 Java 程式碼。

目錄
  1. Lambda運算式
  2. 串流API
  3. Lambda程式設計
  4. JavaFX
  5. 嶄新的日期時間API
  6. 並行處理增強之處
  7. JavaScript引擎Nashorn
  8. 其他好東西
  9. 你可能忽略掉的Java 7功能

2015/05/13

Raspberry Pi與Java 8:Hello World

嘿,我好久沒寫Java的程式,聽說Raspberry Pi/Raspbian已預設安裝Java 8(套件名oracle-java8-jdk),來試試看吧。

首先是簡單的Hello World,程式碼如下:

public class HelloWorld{
        public static void main(String[] args){
                System.out.println("Hello, world!");
        }
}

儲存為檔名HelloWorld.java,然後進行編譯:

$ javac HelloWorld.java

得到HelloWorld.class,然後執行:

$ java HelloWorld
Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld : Unsupported major.minor version 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
Could not find the main class: HelloWorld. Program will exit.

嘿,怎麼會這樣呢?這麼簡單的程式碼也出錯?查詢javac與java的版本後,

$ javac -version
javac 1.8.0

$ java -version
java version "1.6.0_34"
OpenJDK Runtime Environment (IcedTea6 1.13.6) (6b34-1.13.6-1~deb7u1+rpi1)
OpenJDK Zero VM (build 23.25-b01, mixed mode)

發現兩者不同,所以問題應該是程式被編譯為1.8版,但執行環境(JRE、JVM)卻是1.6版,於是無法執行。嗯,怎麼辦呢?試著以參數指定版本吧:

$ javac -source 1.6 -target 1.6 HelloWorld.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6
1 warning

$ java HelloWorld
Hello, world!

哇,成功囉。

嗯,不過我想玩Java 8的新功能與新特色啊,拜過孤狗大神後,到Oracle JDK的網頁,下載JDK 8 for ARM,我下載的是jdk-8u33-linux-arm-vfp-hflt.tar.gz,放在家目錄裡,然後進行底下的步驟:

$ sudo mkdir -v -v /opt/java

$ sudo tar zxvf ~/jdk-8u33-linux-arm-vfp-hflt.tar.gz -C /opt/java

解壓縮並把所有東西放進/opt/java裡的子目錄jdk1.8.0_33,此時可刪除原先的壓縮檔。然後是告知系統我們想要使用剛剛安裝的Java版本。

$ sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk1.8.0_33/bin/java" 1

$ sudo update-alternatives --set java /opt/java/jdk1.8.0_33/bin/java
update-alternatives: using /opt/java/jdk1.8.0_33/bin/java to provide /usr/bin/java (java) in manual mode

查看版本,都是1.8囉。

$ javac -version
javac 1.8.0

$ java -version
java version "1.8.0_33"
Java(TM) SE Runtime Environment (build 1.8.0_33-b05)
Java HotSpot(TM) Client VM (build 25.33-b05, mixed mode)

另外,有些軟體需要環境變數JAVA_HOME,請編輯~/.bashrc,加入:

export JAVA_HOME="/opt/java/jdk1.8.0_33"
export PATH=$PATH:$JAVA_HOME/bin

耶,趕快來玩Java 8吧。


參考資料: