2-Java 8環(huán)境搭建及十大新特性詳解

課程概要:
  1、Java8概述
  2、下載jdk 1.8
  3邑蒋、安裝jdk 1.8
  4、配置環(huán)境變量
  5按厘、在Eclipse中使用jdk 1.8
  6医吊、lambda
   6.1 lambda概述
   6.2 lambda案例(上)
   6.3 lambda案例(下)
  7、Stream類
  8逮京、過濾器案例
  9卿堂、DoubleStream接口
  10、日期類-LocalDate類
  11、時(shí)間類LocalTime
  12草描、日期時(shí)間類-LocalDateTime
  13览绿、DateTimeFormatter類-解析字符串為日期
  14、ZoneDateTime類:格式化日期為字符串


1穗慕、Java 8概述

</br>一饿敲、Java 8版本
  1. oracle公司于2014年3月27日正式推出Java 8
  2. Java SE 8
  3. Java ME 8
  4. Java Embedded 8
二、Java SE8 的重要性能包括:

1逛绵、Lambda
2怀各、Nashorn JavaScript引擎
3、新的日期與時(shí)間API
4术浪、一套簡潔的配置文件
5瓢对、從JVM中去除了“永久代(permanent generation)”
6、增強(qiáng)的注解功能

三胰苏、Java SE Embedded 8

1硕蛹、Java SE Embedded 8 為嵌入式及物聯(lián)網(wǎng)設(shè)備提供了一個(gè)開發(fā)平臺(tái),具備Java SE 8 的靈活性硕并、可移植性和功能法焰。
2、Java SE Embedded 8使開發(fā)人員能夠使用Java SE 8為嵌入式設(shè)備建立更小的平臺(tái)鲤孵。

四、Java ME 8

1辰如、與Java SE 8一致的Java語言和API
2普监、支持最新的Web協(xié)議
3、全面的應(yīng)用模型
4琉兜、先進(jìn)的安全功能
5凯正、用于電源管理及多種標(biāo)準(zhǔn)外部設(shè)備交互的標(biāo)準(zhǔn)API


2、下載jdk 1.8

jdk下載官網(wǎng)網(wǎng)址:
http://www.oracle.com/technetwork/java/javase/downloads/index.html


3豌蟋、安裝jdk 1.8

不要把jdk 1.8.0和jre1.8.0安裝在一個(gè)文件夾下


4廊散、配置環(huán)境變量

1、在系統(tǒng)變量中設(shè)置JAVA_HOME變量
2梧疲、在用戶變量中設(shè)置PATH變量
3允睹、在用戶變量中設(shè)置CLASS PATH變量

過程:
①系統(tǒng)變量→新建 JAVA_HOME 變量 。
變量值填寫jdk的安裝目錄(本人是 C:\Java\jdk1.8.0)

②系統(tǒng)變量→尋找 Path 變量→編輯
在變量值最后輸入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
(注意原來Path的變量值末尾有沒有;號幌氮,如果沒有缭受,先輸入;號再輸入上面的代碼)

③系統(tǒng)變量→新建 CLASSPATH 變量
變量值填寫
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一點(diǎn))
系統(tǒng)變量配置完畢该互。

在cmd下輸入java -version 查看當(dāng)前版本米者。

參考網(wǎng)址:
http://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html


5、在Eclipse中使用JDK 8

Eclipse下載地址:http://www.eclipse.org/downloads/


6、lambda

6.1 lambda概述

</br>課程概要:
  lambda概述
  為什么使用lambda?
  lambda語法

一蔓搞、lambda概述

表達(dá)了計(jì)算機(jī)中最基本的概念:調(diào)用和置換

二胰丁、為什么使用lambda

1、Java是面向?qū)ο蟮恼Z言喂分,不能像函數(shù)語言那樣嵌套定義方法

2锦庸、Java的匿名內(nèi)部只能存在于創(chuàng)建它的線程中,不能運(yùn)行在多線程中妻顶,無法充分應(yīng)用多核的硬件優(yōu)勢

3酸员、匿名內(nèi)部類的缺點(diǎn)還有:
  1) 語法相對復(fù)雜
  2) 在調(diào)用內(nèi)部類的上下文中,指引和this的只帶
  3) 類加載和實(shí)例創(chuàng)建語法不可避免
  4) 不能引用外部的非final對象
  5) 不能抽象化控制流程

三讳嘱、lambda語法

</br>lambda的語法包括三部分
  1幔嗦、參數(shù)列表
  2、符號箭頭 "->"
  3沥潭、代碼塊


6.2 lambda案例(上)

【案例】用lambda簡化Runnable接口的實(shí)現(xiàn)方式

public class Test_lambda{


    public static void main(String[] args){
        new Runnable(){

            public void run(){
                System.out.println("Anonymous Runnable Interface");
            }
        }.run();
    }
}
public class Test_lambda{


    public static void main(String[] args){
        new Runnable(){
                  //使用匿名內(nèi)部類是無法使用外部變量的
                  //要使用必須改成常量
            public void run(){
                System.out.println("Anonymous Runnable Interface");
            }
        }.run();邀泉、

        int i=1;
        Runnable r=()->{
                        //lambda 可以使用外部變量
            System.out.println("Use lambda to realize Runnable Interface");
                      //i++;     這樣的語法是錯(cuò)誤的,lambda不允許直接改變外部變量的值
            System.out.println("i="+i);
        };
        r.run();
    }
}

6.3 lambda案例(下)

【案例】lambda實(shí)現(xiàn)自定義接口钝鸽,模擬登入操作

public class Test_lambda_01{

//使用匿名內(nèi)部類實(shí)現(xiàn)
    public static void main(String[] args){
        new Action(){
            public void execute(String content){
                System.out.println(content);
            }   
        }.execute("use anonymous inner class to realize entry before jdk 1.8");
        
    }

    //  define one interface
    static interface Action{
        void execute(String content);

    }
}
public class Test_lambda_01{


    public static void main(String[] args){
        new Action(){
            public void execute(String content){
                System.out.println(content);
            }   
        }.execute("use anonymous inner class to realize entry before jdk 1.8");

        //use lambda to realize entry
        Action login=(String content)->{
            System.out.println(content);
        };
        login.execute("use lambda to realize this function in jdk 1.8");
    }

    //  define one interface
    static interface Action{
      // 定義一個(gè)方法execute
        void execute(String content);

    }
}

7汇恤、Stream 接口

</br>課程概要:
   什么是Stream
   什么是管道
   什么是過濾器

一 、什么是Stream

1拔恰、Stream在Java 8中被定義為泛型接口

2因谎、Stream接口代表數(shù)據(jù)流

3、Stream不是一個(gè)數(shù)據(jù)結(jié)構(gòu)颜懊,不直接存儲(chǔ)數(shù)據(jù)

4财岔、Stream通過管道操作數(shù)據(jù)

5、創(chuàng)建Stream接口實(shí)現(xiàn)類對象
stream():創(chuàng)建一個(gè)Stream接口實(shí)現(xiàn)類的對象河爹。
例如:

//Person is a class defined by yourself 
Stream<Person> stream=people.stream();

二匠璧、什么是管道

1、管道:代表一個(gè)操作序列

2咸这、管道包含一下組件:
  1) 數(shù)據(jù)集:可能是集合夷恍、數(shù)組等
  2) 零個(gè)或多個(gè)中間業(yè)務(wù)。如過濾器
  3) 一個(gè)終端操作媳维,如forEach

三酿雪、什么是過濾器

1、過濾器:用給定的條件在源數(shù)據(jù)基礎(chǔ)上過濾出新的數(shù)據(jù)侄刽,并返回一個(gè)Stream對象

2执虹、過濾器包含匹配的謂詞
例如:判斷p對象是否是男性的lambda表達(dá)式

Stream<Person> stream=people.stream();
stream=stream.filter(p->p.getGender()=='男');

【案例】創(chuàng)建一個(gè)元素為Person類的集合:people
使用Stream和forEach顯示該集合對所有元素
先創(chuàng)建Person.java唠梨,再創(chuàng)建Test_collection_stream.java

package java_study;

public class Person {
    public static enum Sex{
        MALE,FEMALE;
    }
    private String name;
    private Sex gender;
    private int age;
    private double height;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Sex getGender() {
        return gender;
    }
    public void setGender(Sex gender) {
        this.gender = gender;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    
    public Person() {
        // TODO Auto-generated constructor stub
        
    }
    public Person(String name, Sex gender, int age, double height) {
        super();
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.height = height;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", gender=" + gender + ", age=" + age + ", height=" + height + "]";
    }
    
}
package java_study;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;;


public class Test_collection_stream {
    public static void main(String[] args) {
        List<Person> people=createPeople();//initialize the list
        Stream<Person> stream=people.stream();
        stream.forEach(
                p->System.out.println(p.toString())
                );
    }
    
    static List<Person> createPeople(){
        List<Person> people=new ArrayList<>();
        Person p=new Person("zhangfei",Person.Sex.MALE,33,1.99);
        people.add(p);
        p=new Person("huangfei",Person.Sex.FEMALE,32,1.71);
        people.add(p);
        p=new Person("wangfei",Person.Sex.FEMALE,31,1.69);
        people.add(p);
        p=new Person("lifei",Person.Sex.MALE,33,1.89);
        people.add(p);
        return people;
    }
}

8袋励、過濾器案例

【案例】創(chuàng)建一個(gè)元素為Person類的集合:people

Person [name="zhangfei", gender=FEMALE, age=32, height=1.69]
Person [name="lifei", gender=MALE, age=31, height=1.72]

依舊是先創(chuàng)建Person類

package java_study;

public class Person {
    public static enum Sex{
        MALE,FEMALE;
    }
    private String name;
    private Sex gender;
    private int age;
    private double height;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Sex getGender() {
        return gender;
    }
    public void setGender(Sex gender) {
        this.gender = gender;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    
    public Person() {
        // TODO Auto-generated constructor stub
        
    }
    public Person(String name, Sex gender, int age, double height) {
        super();
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.height = height;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", gender=" + gender + ", age=" + age + ", height=" + height + "]";
    }
    
    
}

再創(chuàng)建Test_collection_fliter類

package java_study;

import java.util.ArrayList;
import java.util.List;

public class Test_collection_fliter {

    public static void main(String[] args) {
        List<Person> people=createPeople();//initialize the list
        people.stream()
            .filter(p->p.getGender()==Person.Sex.FEMALE)
            .forEachOrdered(p->System.out.println(p.toString()));
    
    }
    
    static List<Person> createPeople(){
        List<Person> people=new ArrayList<>();
        Person p=new Person("zhangfei",Person.Sex.MALE,33,1.99);
        people.add(p);
        p=new Person("huangfei",Person.Sex.FEMALE,32,1.71);
        people.add(p);
        p=new Person("wangfei",Person.Sex.FEMALE,31,1.69);
        people.add(p);
        p=new Person("lifei",Person.Sex.MALE,33,1.89);
        people.add(p);
        return people;
    }
}

9、DoubleStream接口

一、DoubleStream接口表示元素類型是double的數(shù)據(jù)源

</br>二茬故、DoubleStream接口的常用方法:

1盖灸、max().getAsDouble():獲取流中數(shù)據(jù)集的最大值
  2、stream.min().getAsDouble():獲取流中數(shù)據(jù)集的最小值
  3磺芭、stream.average():獲取流中數(shù)據(jù)集的平均值

【案例】統(tǒng)計(jì)people集合中姓名包含"fei"的平均身高

package java_study;

public class Person {
    public static enum Sex{
        MALE,FEMALE;
    }
    private String name;
    private Sex gender;
    private int age;
    private double height;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Sex getGender() {
        return gender;
    }
    public void setGender(Sex gender) {
        this.gender = gender;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    
    public Person() {
        // TODO Auto-generated constructor stub
        
    }
    public Person(String name, Sex gender, int age, double height) {
        super();
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.height = height;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", gender=" + gender + ", age=" + age + ", height=" + height + "]";
    }
    
    
}
package java_study;

import java.util.ArrayList;
import java.util.List;

public class Test_collection_doublestream {


    public static void main(String[] args) {
        List<Person> people=createPeople();//initialize the list
        double avgHeight=people.stream()
            .filter(p->p.getName().indexOf("fei")>=0)
            .mapToDouble(p->p.getHeight())
            .average()
            .getAsDouble();
        System.out.println("the average height of these guys whose name includes 'fei' is "+avgHeight);
    }
    
    static List<Person> createPeople(){
        List<Person> people=new ArrayList<>();
        Person p=new Person("zhangfi",Person.Sex.MALE,33,1.99);
        people.add(p);
        p=new Person("huangfei",Person.Sex.FEMALE,32,1.71);
        people.add(p);
        p=new Person("wangfei",Person.Sex.FEMALE,31,1.69);
        people.add(p);
        p=new Person("life",Person.Sex.MALE,33,1.89);
        people.add(p);
        return people;
    }

}

10赁炎、LocalDate類

</br>課程概要:
   概述
   常用方法

一、概述

LocalDate類使用ISO日歷表示年钾腺、月徙垫、日

二、LocalDate類的常用方法:

1放棒、LocalDate.now() :獲取系統(tǒng)當(dāng)前日期
  2姻报、LocalDate.of(int year, int month, int dayOfMonth) 按指定日期創(chuàng)建LocalDate對象
  3间螟、getYear():返回日期中的年份
  4吴旋、getMonth():返回日期中的月份
  5、getDayOfMonth():返回月份中的日

【案例】用LocalDate獲取當(dāng)前日期

package java_study;

import java.time.LocalDate;
import java.time.LocalDateTime;

public class Test_LocalDate {
    public static void main(String[] args){
        LocalDate date = LocalDate.now();
        System.out.print(date.getYear()+"年");
        System.out.print(date.getMonthValue()+"月");
        System.out.println(date.getDayOfMonth()+"日");
        System.out.println(date.toString());

    }
}

11厢破、LocalTime類

</br>課程概要:
   概述
   常用方法

一荣瑟、概述

LocalTime類用于表示一天中的時(shí)間

二、LocalTime類的常用方法:

1摩泪、LocalTime.now():獲取系統(tǒng)當(dāng)前時(shí)間
  2笆焰、LocalTime.of(int hour, int minute, int second)
    按指定時(shí)間創(chuàng)建LocalTime對象
  3、getHour():返回小時(shí)
  4见坑、getMinute():返回分鐘
  5嚷掠、getSecond():返回秒

【案例】用LocalTime獲取當(dāng)前時(shí)間

package java_study;

import java.time.LocalTime;

public class Test_LocalTime {
    public static void main(String[] args) {
        LocalTime time=LocalTime.now();
        System.out.print(time.getHour()+"時(shí)");
        System.out.print(time.getMinute()+"分");
        System.out.println(time.getSecond()+"秒");
        System.out.println(time.toString());
        
    }
}

12、LocalDateTime類

</br>課程概要:
   概述
   常用方法

一鳄梅、概述

LocalDateTime類用于表示日期和時(shí)間

二叠国、LocalDateTime類的常用方法:

1未檩、LocalDateTime.now():獲取系統(tǒng)當(dāng)前時(shí)間
  2戴尸、LocalDateTime.of(int year, int month, int dayOfMonth)
    按指定時(shí)間創(chuàng)建LocalDateTime對象
  3冤狡、getYear():返回日期中的年份
  4孙蒙、getMonth():返回日期中的月份
  5、getDayOfMonth():返回月份中的日

【案例】用LocalDateTime獲取當(dāng)前日期和時(shí)間

package java_study;

import java.time.LocalDateTime;

public class Test_LocalDateTime {
    
    public static void main(String[] args) {
        LocalDateTime date=LocalDateTime.now();
        System.out.print(date.getYear()+"年");
        System.out.print(date.getMonthValue()+"月");
        System.out.println(date.getDayOfMonth()+"日");
        System.out.print(date.getHour()+"時(shí)");
        System.out.print(date.getMinute()+"分");
        System.out.println(date.getSecond()+"秒");
        System.out.println(date.toString());
    }
}


13悲雳、DateTimeFormatter類

</br>課程概要:
   概述
   常用方法

一挎峦、概述

DateTimeFormatter類用于將字符串解析為日期

二、常用方法

1合瓢、static ofPattern(String pattern);
  作用:按pattern字符串指定的格式創(chuàng)建
  DateTimeFormatter對象

2坦胶、LocalDateTime.parse(strDate, formatter);

【案例】將字符串"2014-04-01:13:24:01"格式化為一個(gè)LocalDateTime類的對象,并顯示年、月顿苇、日峭咒、時(shí)、分纪岁、秒

package java_study;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test_DateTineFormatter {
    public static void main(String[] args) {
        String time="2014-04-01:13:24:01";
        DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyy-MM-dd:HH:mm:ss");
        LocalDateTime date=LocalDateTime.parse(time, formatter);
        System.out.println(date.toString());
    }
}

14凑队、ZoneDateTime類

</br>課程概要:
   概述
   常用方法

一、概述

ZoneDateTime處理日期和時(shí)間與相應(yīng)的時(shí)區(qū)

二幔翰、常用方法

1漩氨、ZoneDateTime.now()
    獲取系統(tǒng)當(dāng)前日期和事件

2、String format(DateTimeFormatter formatter)
    按指定模板將日期對象格式化為一個(gè)字符串

【案例】將當(dāng)前日期格式化為字符串并顯示年遗增、月叫惊、日、時(shí)贡定、分赋访、秒

package java_study;

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Test_ZonedDateTime {
    
    public static void main(String[] args) {
        ZonedDateTime date=ZonedDateTime.now();
        DateTimeFormatter formatter=DateTimeFormatter.ofPattern("MM/dd/yyyy:HH:mm:ss");
        String strDate=date.format(formatter);
        System.out.println(strDate);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缓待,隨后出現(xiàn)的幾起案子蚓耽,更是在濱河造成了極大的恐慌,老刑警劉巖旋炒,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件步悠,死亡現(xiàn)場離奇詭異,居然都是意外死亡瘫镇,警方通過查閱死者的電腦和手機(jī)鼎兽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣除,“玉大人谚咬,你說我怎么就攤上這事∩姓常” “怎么了择卦?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長郎嫁。 經(jīng)常有香客問我秉继,道長,這世上最難降的妖魔是什么泽铛? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任尚辑,我火速辦了婚禮,結(jié)果婚禮上盔腔,老公的妹妹穿的比我還像新娘杠茬。我一直安慰自己月褥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布瓢喉。 她就那樣靜靜地躺著吓坚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灯荧。 梳的紋絲不亂的頭發(fā)上礁击,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音逗载,去河邊找鬼哆窿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛厉斟,可吹牛的內(nèi)容都是我干的挚躯。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼擦秽,長吁一口氣:“原來是場噩夢啊……” “哼码荔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起感挥,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤缩搅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后触幼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硼瓣,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年置谦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堂鲤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡媒峡,死狀恐怖瘟栖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谅阿,我是刑警寧澤半哟,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站奔穿,受9級特大地震影響镜沽,放射性物質(zhì)發(fā)生泄漏敏晤。R本人自食惡果不足惜贱田,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘴脾。 院中可真熱鬧男摧,春花似錦蔬墩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乔询,卻和暖如春樟插,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竿刁。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工黄锤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人食拜。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓鸵熟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親负甸。 傳聞我的和親對象是個(gè)殘疾皇子流强,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容