jdk1.8新特性

发布时间 2023-07-11 20:26:01作者: 嗝`

1.default关键字

在jdk8之前,接口里面只能包含抽象方法,但是jdk8之后,允许使用default修饰的默认方法。

public interface NewCharacter {
    
    public void test1();
    
    public default void test2(){
        System.out.println("我是新特性1");
    }

}

default作用

所以说这个default方法是所有的实现类都不需要去实现的就可以直接调用,那么比如说jdk的集合List里面增加了一个sort方法,那么如果定义为一个抽象方法,其所有的实现类arrayList,LinkedList等都需要对其添加实现,那么现在用default定义一个默认的方法之后,其实现类可以直接使用这个方法了,这样不管是开发还是维护项目,都会大大简化代码量。

public class NewCharacterImpl implements NewCharacter{

    @Override
    public void test1() {
        
    }
    
    public static void main(String[] args) {
        NewCharacter nca = new NewCharacterImpl();
        nca.test2();
    }

}

2.lambda表达式

  • jdk8开始引用的新的语法格式
  • 作用:简化匿名内部类的代码写法
    lambda表达式的简化格式:
(匿名内部类被重写方法的形参列表)->{
    被重写方法的方法体代码。
}

//ps:->是语法形式,无实际含义
  • lambda表达式只能简化函数式接口的匿名内部类的写法形式

ClassName :: methodName

jdk1.8提供了另外一种调用方式::,当 你 需 要使用 方 法 引用时 , 目 标引用 放 在 分隔符::前 ,方法 的 名 称放在 后 面 ,即ClassName :: methodName 。例如 ,Apple::getWeight就是引用了Apple类中定义的方法getWeight。请记住,不需要括号,因为你没有实际调用这个方法。方法引用就是Lambda表达式(Apple a) -> a.getWeight()的快捷写法,如下示例。

lambda的好处

lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,它可以写出更简介、更灵活的代码,作为一种更紧凑的代码风格,使Java语言表达能力得到了提升

lambda表达式的省略规则

  • 参数类型可以省略不写
  • 如果只有一个参数,参数类型可以省略,同时()也可以省略
  • 如果lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号
  • 如果lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时必须省略“;”

3.什么是函数式接口

  • 首先必须是接口、其次接口中仅有一个抽象方法的形式
  • @FunctionalInterface//一旦加上这个注释必须为函数式接口,且只有一个抽象方法

Stream流

  • 在Java8 中,得益于Lambda所带来的函数式编程,引入 了一个全新的Stream流概念
  • 目的:用于简化集合和数组操作的API

Stream流思想的核心:

  1. 先得到集合或者数组的Stream流(就是一根传送带)
  2. 把元素放上去
  3. 然后用这个Stream流简化的Api来方便元素操作

Stream流的三类方法

  • 获取Stream流
    • 创建一条流水线,并把数据放到流水线上准备进行操作
  • 中间方法
    • 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作
  • 终结方法
    • 一个Stream流只有一个终结方法,是流水线上的最后一个操作

获取Stream流

  1. 集合获取Stream流的方式
  • 可以使用Collection接口中默认方法stream()生成流
  1. 数组获取Stream流的方式
//集合数据流
        Collection<String> list=new ArrayList<>();
        Stream<String> stream = list.stream();

        //map
        Map<String,Integer> map=new HashMap<>();
        //键流
        Stream<String> stream1 = map.keySet().stream();
        //值流
        Stream<Integer> stream2 = map.values().stream();
        //键值对流
        Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();

        //数组
        String[] name={"dasf","dfa","dfa"};
        //public static <T> Stream<T> stream(T[] array) 
        Stream<String> stream4 = Arrays.stream(name);
        //public static<T> Stream<T> of(T... values) {
        Stream<String> stream5 = Stream.of(name);

Stream流的常用API(中间方法)

image

注意:

  • 中间方法也称非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
  • 在Stream流中无法直接修改集合、数组的数据

案例api-lambda-app-----d13-demo

Stream流的收集操作

  • 收集Stream流的含义:就是把Stream流操作后的结果数据传回到集合或者数组中去。(Stream流:方便操作集合/数组的手段)
  • 集合/数组才是开发目的。

Stream流的收集方法 api-lambda-app-----d13-demo2

image
注意:流只能使用一次