美文网首页
2-Java 8环境搭建及十大新特性详解

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

作者: LuCh1Monster | 来源:发表于2016-03-15 22:23 被阅读169次

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

    相关文章

      网友评论

          本文标题:2-Java 8环境搭建及十大新特性详解

          本文链接:https://www.haomeiwen.com/subject/rvuflttx.html