Java8的新增特性简单了解

Java8的新增特性


Java8增加了什么?

1.Lambda表达式
2.JavaScript的引擎
3.新的日期与时间Api
4.简洁的配置文件
5.jvm删除了永久代(premanent generation)
6.增强的注解功能

本文着重叙述

1.Lambda表达式
2.Stream
3.时间api


一、Lambda表达式

  1. 为什么使用Lambda表达式:
    a. Java是面向对象的语言不能像函数式语言嵌套定义方法
    b. 匿名内部类智能存在于创建他的线程中,不能运行在多线程中,无法发挥多核硬件
    c. 匿名内部类语法复杂
    • 调用内部类的上下文中,指引和this的指代容易混淆、
    • 类加载和创建实例的语法不可避免
    • 不能引用外部的非final对象
    • 不能抽象化控制流程
  2. Lambda语法包括:
    a. 参数列表
    b.箭头符号"->"
    c.代码块

eg: lambda简化Runnable接口
原来:

  public class Main {
        public static void main(String[] args) {
            new Runnable(){
                @Override
                public void run(){
                    System.out.println("匿名内部类实现RUnnable接口");
                }
            }.run();
        }
  }

现在:

    public class Main {
            public static void main(String[] args) {
                int i=1;
                Runnable r=()->{
                    System.out.println("Lambda表达式实现Runnable接口");
                    System.out.println("i="+i);
                    //i++;错误:不允许在lambda表达式中直接修改外部变量的值
                };
                r.run();
            }
  }

eg:Lambda实现自定义接口并模拟登陆
原来:

class Test{
    public static void main(String[] args) {
        new Action(){
            @Override
            public void execute(String content){
                System.out.println(content);
            }
        }.execute("jdk1.8的匿名内部类实现");
    }
    static interface Action{
        void execute(String content);
    }
}

现在:

class Test{
    public static void main(String[] args) {
        Action login=(String content)->{
            System.out.println(content);
        };
        login.execute("jdk1.8的Lambda语法操作");
    }
    static interface Action{
        void execute(String content);
    }
}

二、Stream接口

  1. Stream的定义:
    a. Stream在java8中被定义为泛型接口;
    b. Stream接口代表数据流,与IO流不同;
    c. Stream不是数据结构,不直接存储数据;
    d. Stream通过管道操作数据;
    e. 创建Stream接口实现类的对象;stream():创建一个Stream接口实现类的对象。
    如:Stream<Person> stream=people.stream();
  2. 关于管道:
    a. 代表一个序列
    b. 管道包含以下组件:
    • 数据集:集合、数组等;
    • 零或多个中间业务。如过滤器;
    • 一个终端操作,如foreach

三、过滤器

  1. 定义:用给定的条件在源数据基础上过滤出新的数据,并且返回一个Stream对象。
  2. 过滤器包含匹配的谓词。
    如:判断p对象是否为男性的lambda表达式:
  Stream<Person> stream=people.stream();
  stream=stream.filter(p->p.getGender()=='男');

案例:

  • People类:
public class People {
    public static enum Sex{
        MALE,FEMALE;
    }

    private String name;
    private Sex gender;
    private int age;
    private double height;

    public String getName() {
        return name;
    }

    public Sex getGender() {
        return gender;
    }

    public int getAge() {
        return age;
    }

    public double getHeight() {
        return height;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setGender(Sex gender) {
        this.gender = gender;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public People(String name, Sex gender, int age, double height) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.height = height;
    }

    public People() {
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", gender=" + gender +
                ", age=" + age +
                ", height=" + height +
                '}';
    }

}

  • TestPeople类:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class TestPeople {
    public static void main(String[] args) {
        List<People> people=creatPeople();
        Stream<People>sp=people.stream().filter(p0 -> p0.getGender()!=People.Sex.MALE);
        sp.forEach(
            p0->System.out.println(p0.toString())
        );
    }
    static List<People> creatPeople(){
        List<People> people=new ArrayList<People>();
        People p0=new People("1", People.Sex.FEMALE,1,1.23);
        people.add(p0);
        p0=new People("12", People.Sex.MALE,2,2.23);
        people.add(p0);
        p0=new People("123", People.Sex.FEMALE,3,3.23);
        people.add(p0);

        return people;

    }
}

结果:

//过滤掉了男性
  People{name='1', gender=FEMALE, age=1, height=1.23}
  People{name='123', gender=FEMALE, age=3, height=3.23}

四、DoubleStream接口

  1. 定义:DoubleStream接口表示元素类型是double的数据源
  2. 常用方法:
    a. stream.max().getAsDouble():获取流中数据集的最大值。
    b. stream.min().getAsDouble():获取流中数据集的最小值。
    c. stream.average():平均值。

案例:使用DoubleStream接口,筛选出其中名字中带有数字“1”的人的平均身高

  • mapTODouble是将筛选的数据放到一个数据源中;
  • average()返回值是OptionalDouble类型的,所以需要.getAsDouble();
public static void main(String[] args) {
    List<People> people=creatPeople();
    Stream<People>sp=people.stream().filter(p0 -> p0.getGender()!=People.Sex.MALE);

    double ave=sp.filter(p->p.getName().indexOf("1")>=0)
            .mapToDouble(p->p.getHeight())
            .average().getAsDouble();
    System.out.println(ave);
}

//2.23

五、LocalDate类

LocalDate使用ISO日历表示年月日
常用方法:

  1. LocalDate.now();获取系统当前日期
  System.out.println(LocalDate.now());
  //2018-06-26
  1. LocalDate.of(int year,int month,int dayOfMonth)按照指定日期创建LocalDate对象
  2. LocalDate.now().
    • getYear():返回日期中的年份
    • getMonth():返回日期中的年份
    • getDayOfMonth():返回月份中的第几天
      以上三种方法返回int型

eg:

  System.out.println(LocalDate.now().getDayOfMonth());
  //26

六、LocalTime类

获取时间
常用方法:

  1. LocalTime.now():获取当期时间//14:32:58.536
  2. LocalTime.of(int hour,int minute,int second)按照指定日期创建LocalDate对象
  3. LocalTime.now().
    • getHour():返回小时
    • getMinute():返回分钟
    • getSecond():返回秒
      用法同上

七、LocalDateTime类的常用方法

LocalDateTime类用于获取时间和日期
常用方法:

  1. localDateTime.now();获取系统当前时间
  2. LocalDateTime.of(int year,int month,int dayOfMonth,int hour,int minute,int second)按照指定日期和时间创建LocalDateTime对象
  3. getYear():返回日期中的年份
  4. getMonth():返回日期中的年份
  5. getDayOfMonth():返回月份中的第几天
  6. getHour():返回小时
  7. getMinute():返回分钟

八、DateTimeFormatter类

用于将字符串解析为日期
常用方法:

  1. static ofPattern(String pattern);作用:按pattern字符串指定的格式创建DateTimeFormatter对象
  2. LocalDateTime.parse(strDate,formatter);按照formatter对象的格式规范strDate后返回一个标准LocalDateTime
    eg:
//规定格式
DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyy-MM-dd:HH:mm:ss");
//转换格式并打印
System.out.println(LocalDateTime.parse("2014-04-01:13:24:01",formatter).toString());

九、ZonedDateTime类

用于处理日期和时间与相应的时区。
常用方法:

  1. ZonedDateTime.now()获取系统当前日期和事件。
  2. String format(DateTimeFormatter formatter)按照指定模板将日期对象格式化为一个字符串。

eg:

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

推荐阅读更多精彩内容