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());
            }
        };

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

Runnable runnable1 = () ->{
  
        System.out.println(Thread.currentThread().getName());
    
};

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

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):    
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日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。

你可能感兴趣的:(学习记录,java新特性,开发语言,java8)