• java8新特性


    一、java8新特性

    1.Lambda 表达式

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包,和传统数学上的意义有区别。

    如何使用 Lambda 表达式

    平时我们使用来创建匿名内部类来实现Runnable接口

       Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                }
            };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果我们使用Lambda 表达式就可以简写为如下代码

    Runnable runnable1 = () ->{
      
            System.out.println(Thread.currentThread().getName());
        
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ()-> 左边的作为变量,右边所代表为匿名内部内部类,如果只有一行代码,就可以省略代码

    2.函数式接口

    2.1.函数式接口定义

    • 函数式接口: 有且仅有一个抽象方法的接口。

    • Java中的函数式编程体现就是Lambda表达式。

    • 所以函数式接口即可以适用于Lambda使用的接口。

    • 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda

    表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方

    法上进行声明).

    • 我们可以在任意函数式接口上使用 @FunctionalInterface 注解,

    这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包

    含一条声明,说明这个接口是一个函数式接口。

    2.2、四大函数接口

    • Supplier接口 供给型接口没有参数,有返回值; T get();
    • Consumer接口 消费型接口,没有返回值,没有参数;void accept(T t)
    • Predicate接口 断定型接口 有参数有返回值布尔类型返回值 boolean test(T t);
    • Function接口对 函数型接口 有参数又返回值 Rapply(T t);

    2.3、方法引用与构造器引用

    2.3.1、方法引用!

    当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!

    对象::实例方法名

    类::静态方法名

    类::实例方法名

    2.3.3、构造器引用

    与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致!

    格式:ClassName::new

    3、stream APi

    3.1、stream 简介

    Stream是Java 8中引入的全新API,可以极大地方便我们对集合、数组等数据源进行连续操作。它可以简化我们的代码,使代码更加易于维护和理解。Stream实际上是一种惰性计算的方式,只有需要输出结果时,才会开始计算。

    3.2、stream操作

    创建stream :获取一个集合获取stream

    stream操作: 对stream 进行不同的操作

    结束stream流: 终止stream流的操作,将他的元素进行打印,或者收集

    3.2.1、创建stream流

    我可以通过以下方法创建stream流

    default Stream<E> stream():返回一个顺序流
    default Stream<E>parallelStream():返回一个并行流
    
    Java8中的Arrays的静态方法stream()可以获取数组流   
    static<T>Stream<T>stream(T[]array):返回一个流
    public static IntStream stream(int[]array) 
    public static LongStream stream(long[]array)
    public static DoubleStream stream(double[]array)
    
    由值创建流    
    public static<T>Stream<T>of(T...values): 返回一个流 
        
    由函数创建流:创建无限流    
    public static<T> Stream<T> iterate(final  Tseed,final UnaryOperator<T>f) 生成
    public static<T> Stream<T> generate(Supplier<T> s):    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    3.2.2、Stream中间操作

    中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”

    方法描述
    filter(Predicatep接收Lambda,从流中排除某些元素。
    distinct()筛选,通过流所生成元素的hashCode()和equals()去除重复元素
    limit(longmaxSize)截断流,使其元素不超过给定数量。
    skip(longn)跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补
    map(Functionf)接收一个函数作为参数,该函数会被应用到每个元
    mapToDouble(ToDoubleFunctionf)素上,并将其映射成一个新的元素。接收一个函数作为参数,该函数会被应用到每个元
    flatMap(Functionf)素上,产生一个新的DoubleStream。接收一个函数作为参数,将流中的每个值都换成另
    3.3.3、Stream的终止操作

    终端操作会从流的流水线生成结果。其结果可以是任何不是流的

    值,例如:List、Integer,甚至是void 。

    方法描述
    count()返回流中元素总数
    forEach(Consumerc迭代元素
    reduce(T iden, BinaryOperatorb)可以将流中元素反复结合起来,得到一个值。
    reduce(BinaryOperatorb)可以将流中元素反复结合起来,得到一个值。
    collect(Collectorc)将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法实现

    Collector接口中方法的实现决定了如何对流执行收集操作(如收集到List、Set、Map)。但是Collectors实用类提供了很多静态方法,可以方便地创建常见收集器实例,具体方法与实例如下表:

    4、新时间日期API

    使用LocalDateLocalTime、LocalDateTime

    例是不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。

  • 相关阅读:
    深度学习入门(三十)卷积神经网络——NiN
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    网络安全第一次作业
    C#:winform 检查DataGridView单元格是否为空
    数据结构实战开发教程(四)线性表的链式存储结构、单链表的具体实现、单链表的遍历与优化、典型问题分析(Bugfix)
    Pulsar 也会重复消费?
    删除或者移动文件/文件夹时,提示:文件/文件夹正在使用
    Nginx网站服务
    前端sql条件拼接js工具
    Kubernetes 深入理解Kubernetes(二) 声明组织对象
  • 原文地址:https://blog.csdn.net/Afu1021/article/details/133626108