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

2016-03-15  本文已影响169人  LuCh1Monster

课程概要:
  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);
    }
}
上一篇下一篇

猜你喜欢

热点阅读