028-86261949

当前位置:首页 > 技术交流 > Java8新特性

Java8新特性

2021/03/29 11:16 分类: 技术交流 浏览:0

Java8新特性

一:概念

Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8,它发布一些新特性

 

  1. Lambda表达式 − Lambda允许把函数作为一个方法的参数函数作为参数传递进方法中
  2. 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码
  3. 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法
  4. Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中
  5. Date Time API − 加强对日期与时间的处理
  6. Optional  − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常

二:函数式接口

在接口里面只有一个抽象方法的接口,就叫做函数式接口,也可以使用@FunctionalInterface来标记(注意:不管用不用该注解标记,它也是一个函数式接口)

@FunctionalInterface

public interface MyFun {

void show();

}

 

:Lambda表达式

  1. 语法格式

<函数式接口>  <变量名> = (参数1,参数2...) -> {

     //方法体

}

 

  1. 调用无参方法并且无返回值

@FunctionalInterface

public interface MyFun {

void show();

}

MyFun f = ()->System.out.println(“AAA”);

f.show();

  1. 调用无参方法并且有返回值

@FunctionalInterface

public interface MyFun {

int add();

}

MyFun f = ()->3+2;

f.add();

注意:如果在代码块中只有一句代码,{}和return语句都是可以省略的

  1. 调用多个参数的方法

 

@FunctionalInterface

public interface MyFun {

int add(int a,int b);

}

MyFun f = (a,b)->a+b;

f.add(2,3);

注意:如果在代码块中只有一句代码,{}和return语句都是可以省略的,并且在参数列表那里不需要定义数据类型,它会自动推算参数类型

三:方法引用

一:实例方法引用

@FunctionalInterface

public interface MyFun {

void printString(String str);

}

MyFun f = System.out::println;

f.printString(“abc”);

注意:如果要使用方法引用, 抽象方法和参数列表和返回值类型,要和被调用方的方法形参列表和返回值类型一致才可以使用

 

二:构造方法引用

@FunctionalInterface

public interface MyFun {

Student createStudent();

}

MyFun f = Student::new;

注意:它会去调用无参数的构造方法,因为该抽象方法,参数列表是无参的,所以映射下来,也是调用无参数的构造方法,如果抽象方法,形参列表有多个,它也会去调用对应的有参数构造方法

 

三:静态方法引用

@FunctionalInterface

public interface MyFun {

int parseInt(String str);

}

MyFun f = Integer::parseInt;

注意:如果要使用方法引用, 抽象方法和参数列表和返回值类型,要和被调用方的方法形参列表和返回值类型一致才可以使用

四:Stream流

一:概念

Stream(流)是一个来自数据源的元素队列并支持聚合操作,Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等

 

二:操作流的步骤和示例

  1. 创建流
  2. 中间操作
  3. 终止操作

filter--》接收Lambda,从流中排除一些元素

limit--->截断流,使其元素不超过给定的数量

skip(n)--->跳过元素,若流中元素不足n个,则返回一个空流,与limit(n)互补

distinct--》去重,通过元素hashCode和equals来判断的

List<Employee> emps = Arrays.asList(new Employee("张三", 22, 1.5),

new Employee("李四", 12, 1.6),

new Employee("王五", 32, 1.7),

new Employee("王天霸", 52, 1.8),

new Employee("李日勾", 12, 1.9),

new Employee("王天霸", 22, 1.3),

new Employee("王天霸", 22, 1.3));

Stream<Employee> employees= emps.stream()

.filter(t->t.getAge()>=22)  //过滤,年龄大于22

.skip(1)//跳过第一条数据

.distinct();//去重

employees.forEach(System.out::println);

 

 

map 方法用于映射每个元素到对应的结果

emps.stream().map(Employee::getName).forEach(System.out::println);
打印emps里面所有的姓名

 

 

sort  自然排序

sort(Comparator c)  定制排序

List<String> list = Arrays.asList("CCC","BBB","AAA","DDD");

list.stream().sorted().forEach(System.out::println);

List<Employee> emps = Arrays.asList(new Employee("张三", 22, 1.5),

new Employee("李四", 12, 1.6),

new Employee("王五", 32, 1.7),

new Employee("王天霸", 52, 1.8),

new Employee("李日勾", 12, 1.9),

new Employee("王天霸", 22, 1.3),

new Employee("王天霸", 22, 1.3));

emps.stream().sorted((o1,o2)->{

         if(o1.getAge().equals(o2.getAge())){

           return o1.getName().compareTo(o2.getName());

         }

         return o1.getAge().compareTo(o2.getAge());

        }).forEach(System.out::println);

 

#标签:Java,特性