2-Java 8环境搭建及十大新特性详解

课程概要:
  1、Java8概述
  2、下载jdk 1.8
  3、安装jdk 1.8
  4、配置环境变量
  5、在Eclipse中使用jdk 1.8
  6、lambda
   6.1 lambda概述
   6.2 lambda案例(上)
   6.3 lambda案例(下)
  7、Stream类
  8、过滤器案例
  9、DoubleStream接口
  10、日期类-LocalDate类
  11、时间类LocalTime
  12、日期时间类-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、新的日期与时间API
4、一套简洁的配置文件
5、从JVM中去除了“永久代(permanent generation)”
6、增强的注解功能

三、Java SE Embedded 8

1、Java SE Embedded 8 为嵌入式及物联网设备提供了一个开发平台,具备Java SE 8 的灵活性、可移植性和功能。
2、Java SE Embedded 8使开发人员能够使用Java SE 8为嵌入式设备建立更小的平台。

四、Java ME 8

1、与Java SE 8一致的Java语言和API
2、支持最新的Web协议
3、全面的应用模型
4、先进的安全功能
5、用于电源管理及多种标准外部设备交互的标准API


2、下载jdk 1.8

jdk下载官网网址:
http://www.oracle.com/technetwork/java/javase/downloads/index.html


3、安装jdk 1.8

不要把jdk 1.8.0和jre1.8.0安装在一个文件夹下


4、配置环境变量

1、在系统变量中设置JAVA_HOME变量
2、在用户变量中设置PATH变量
3、在用户变量中设置CLASS PATH变量

过程:
①系统变量→新建 JAVA_HOME 变量 。
变量值填写jdk的安装目录(本人是 C:\Java\jdk1.8.0)

②系统变量→寻找 Path 变量→编辑
在变量值最后输入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码)

③系统变量→新建 CLASSPATH 变量
变量值填写
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一点)
系统变量配置完毕。

在cmd下输入java -version 查看当前版本。

参考网址:
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概述

表达了计算机中最基本的概念:调用和置换

二、为什么使用lambda

1、Java是面向对象的语言,不能像函数语言那样嵌套定义方法

2、Java的匿名内部只能存在于创建它的线程中,不能运行在多线程中,无法充分应用多核的硬件优势

3、匿名内部类的缺点还有:
  1) 语法相对复杂
  2) 在调用内部类的上下文中,指引和this的只带
  3) 类加载和实例创建语法不可避免
  4) 不能引用外部的非final对象
  5) 不能抽象化控制流程

三、lambda语法

</br>lambda的语法包括三部分
  1、参数列表
  2、符号箭头 "->"
  3、代码块


6.2 lambda案例(上)

【案例】用lambda简化Runnable接口的实现方式

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(){
                  //使用匿名内部类是无法使用外部变量的
                  //要使用必须改成常量
            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++;     这样的语法是错误的,lambda不允许直接改变外部变量的值
            System.out.println("i="+i);
        };
        r.run();
    }
}

6.3 lambda案例(下)

【案例】lambda实现自定义接口,模拟登入操作

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");
        
    }

    //  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{
      // 定义一个方法execute
        void execute(String content);

    }
}

7、Stream 接口

</br>课程概要:
   什么是Stream
   什么是管道
   什么是过滤器

一 、什么是Stream

1、Stream在Java 8中被定义为泛型接口

2、Stream接口代表数据流

3、Stream不是一个数据结构,不直接存储数据

4、Stream通过管道操作数据

5、创建Stream接口实现类对象
stream():创建一个Stream接口实现类的对象。
例如:

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

二、什么是管道

1、管道:代表一个操作序列

2、管道包含一下组件:
  1) 数据集:可能是集合、数组等
  2) 零个或多个中间业务。如过滤器
  3) 一个终端操作,如forEach

三、什么是过滤器

1、过滤器:用给定的条件在源数据基础上过滤出新的数据,并返回一个Stream对象

2、过滤器包含匹配的谓词
例如:判断p对象是否是男性的lambda表达式

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

【案例】创建一个元素为Person类的集合:people
使用Stream和forEach显示该集合对所有元素
先创建Person.java,再创建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、过滤器案例

【案例】创建一个元素为Person类的集合:people

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

依旧是先创建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 + "]";
    }
    
    
}

再创建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的数据源

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

1、max().getAsDouble():获取流中数据集的最大值
  2、stream.min().getAsDouble():获取流中数据集的最小值
  3、stream.average():获取流中数据集的平均值

【案例】统计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() :获取系统当前日期
  2、LocalDate.of(int year, int month, int dayOfMonth) 按指定日期创建LocalDate对象
  3、getYear():返回日期中的年份
  4、getMonth():返回日期中的月份
  5、getDayOfMonth():返回月份中的日

【案例】用LocalDate获取当前日期

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类用于表示一天中的时间

二、LocalTime类的常用方法:

1、LocalTime.now():获取系统当前时间
  2、LocalTime.of(int hour, int minute, int second)
    按指定时间创建LocalTime对象
  3、getHour():返回小时
  4、getMinute():返回分钟
  5、getSecond():返回秒

【案例】用LocalTime获取当前时间

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()+"时");
        System.out.print(time.getMinute()+"分");
        System.out.println(time.getSecond()+"秒");
        System.out.println(time.toString());
        
    }
}

12、LocalDateTime类

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

一、概述

LocalDateTime类用于表示日期和时间

二、LocalDateTime类的常用方法:

1、LocalDateTime.now():获取系统当前时间
  2、LocalDateTime.of(int year, int month, int dayOfMonth)
    按指定时间创建LocalDateTime对象
  3、getYear():返回日期中的年份
  4、getMonth():返回日期中的月份
  5、getDayOfMonth():返回月份中的日

【案例】用LocalDateTime获取当前日期和时间

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()+"时");
        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字符串指定的格式创建
  DateTimeFormatter对象

2、LocalDateTime.parse(strDate, formatter);

【案例】将字符串"2014-04-01:13:24:01"格式化为一个LocalDateTime类的对象,并显示年、月、日、时、分、秒

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处理日期和时间与相应的时区

二、常用方法

1、ZoneDateTime.now()
    获取系统当前日期和事件

2、String format(DateTimeFormatter formatter)
    按指定模板将日期对象格式化为一个字符串

【案例】将当前日期格式化为字符串并显示年、月、日、时、分、秒

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);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容