JDK1.8新特性

532 阅读3分钟

一. 接口

以往的接口中只能有抽象方法,不能有其他方法,子类必须要实现接口中的所有方法。
现在在接口中可以定义静态方法并实现,可以直接通过接口.方法名来进行调用。
在接口中可以定义默认方法,并且自己实现,子类可以不实现这些默认方法,默认方法使用default关键字进行定义。

image.png

二.函数式接口

接口中只有一个抽象方法的接口叫做函数式接口,JDK中提供了四种基础的函数式接口

  1. Consumer 消费型接口【只接收,不返回】 void accept(T t)
  2. Supplier 供给型接口【只返回,不接收】 T get()
  3. Function 函数型接口 【有输入,有输出,标准函数类型】 R apply(T t)
  4. Predicate 断言型接口【对传入的值进行判断】 boolean test(T t)

三.Lambda表达式

Lambda表达式用于简化匿名内部类的书写,尤其是对于函数式接口来说,更是大大的减少了我们需要写的代码,并且可读性也更好。
基本格式:

(参数列表)->{return 实际方法体}
如果方法只有一个参数a,且方法体只有一行,那么可以继续简写:a->方法体

为什么省略掉了修饰符和返回值?因为Lambda表达式主要用于函数式接口,其中只有一个唯一的抽象方法,
修饰符和返回类型都是唯一确定的。

举例:

        //传统的匿名内部类
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println("接收了:"+s);
            }
        };
       //使用Lambda表达式
       Consumer<String> consumer1 = s-> System.out.println(s);	

一个特殊的表达式 ::

     //1. 对象::实例方法    方法体中的方法和函数式接口中的方法返回值和参数个数都相同,可以进行简化
    Consumer<String> consumer = (s)-> System.out.println(s);
    Consumer<String> consumer1 = System.out::println;

    //2. ::静态方法           函数式接口的参数和返回类型和方法体中调用方法的参数和返回体类型相同。
    Comparator<Integer> comparator = (o1,o2)->Integer.compare(o1,o2);
    Comparator<Integer> comparator1 = Integer::compareTo;

    //3. :: 实例方法
    Function<People,String> function = e-> e.getName();
    Function<People,String> function1 = People::getName;

四.stream()流

stream流是jdk1.8出现的用来对集合进行操作的一种形式

4.1 获取流的方式

  1. 所有的Collection集合都可以通过stream()的方式获取流。
  2. Stream接口的静态方法可以获取相应的流。
       System.out.println("------------------------迭代流----------------------------");
       Stream<Integer> stream2 = Stream.iterate(0, x -> x + 2);
       stream2.limit(1).forEach(System.out::println);
       System.out.println("------------------------生成流----------------------------");

       //生成流
       Stream<Integer> stream3 = Stream.generate(() -> new Random().nextInt(100));
       stream3.limit(1).forEach(System.out::println);

4.2 流的操作

Stream流接口中定义了许多对于集合的操作方法,总的来说分为两大类:中间操作和结束操作。

  • 中间操作会返回另外一个流,通过这种方式将多个中间操作连接起来,形成一个调用链,从而转换为另外一个流,除非调用链后存在一个结束操作,否则中间操作流程不会对结果进行任何处理。
  • 结束操作会返回一个具体的结果。如boolean,integer,list等

4.2.1 中间操作【链式编程】

  • filter 过滤、limit 限制、skip 跳过、distinct 去重、sorted 排序
  • map 数据映射、paraller 获取并行流
List<String> list = new ArrayList<>();
list.add("lvsdfghsd");
list.add("lvsfsdgh");
list.add("lvsfsdgh");
list.add("556dfs");
list.add("lvsd9");

list.stream()
    .sorted((o1,o2)->o1.length()-o2.length())
    .distinct()
    .skip(1)
    .filter(e->e.startsWith("lv"))
    .forEach(System.out::println);

4.2.2 结束操作

  • forEach 遍历、min 求最小、max 求最大、count 技术
  • reduce collect anyMatch 判断流中至少存在一个元素 allMatch

结语

创作不易,如果对您有帮助的话请点个赞哦~