• Lambda表达式
  • 函数式接口
  • *方法引用和构造器调用
  • Stream API
  • 接口中的默认方法和静态方法
  • 新时间日期API
  • 并行和串行
  • 其它

Lambda表达式

Lambda表达式作为Java8语法糖,允许将函数作为参数传入到方法中,但是被传入的函数必须是函数式接口。

Lambda表达式语法:() -> ();

前置语法
无参数无返回值 () -> System.out.println(“Hello WOrld”)
有一个参数无返回值   (x) -> System.out.println(x)
有且只有一个参数无返回值x -> System.out.println(x)
有多个参数,有返回值,有多条lambda体语句(x,y) -> {System.out.println(“xxx”);return xxxx;};
有多个参数,有返回值,只有一条lambda体语句 (x,y) -> xxxx

函数式接口

让我们来看看函数式接口的定义:有且仅有一个抽象方法但可以有多个非抽象方法的接口。这里强调只能有一个抽象方法含义是使用Lambda表达式时如果有多个抽象方法,编译器不知道该选哪个抽象方法。注解@FunctionalInterface用于标识函数式接口。

java1.8之前的函数式接口:

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

java1.8引入了java.util.function包,其中包含了很多函数式接口。这些函数式接口的定义基本上能满足我们日常使用。

序号
接口 & 描述
1
BiConsumer<T,U>
代表了一个接受两个输入参数的操作,并且不返回任何结果
2
BiFunction<T,U,R>
代表了一个接受两个输入参数的方法,并且返回一个结果
3
BinaryOperator<T>
代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
4
BiPredicate<T,U>
代表了一个两个参数的boolean值方法
5
BooleanSupplier
代表了boolean值结果的提供方
6
Consumer<T>
代表了接受一个输入参数并且无返回的操作
7
DoubleBinaryOperator
代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
8
DoubleConsumer
代表一个接受double值参数的操作,并且不返回结果。
9
DoubleFunction<R>
代表接受一个double值参数的方法,并且返回结果
10
DoublePredicate
代表一个拥有double值参数的boolean值方法
11
DoubleSupplier
代表一个double值结构的提供方
12
DoubleToIntFunction
接受一个double类型输入,返回一个int类型结果。
13
DoubleToLongFunction
接受一个double类型输入,返回一个long类型结果
14
DoubleUnaryOperator
接受一个参数同为类型double,返回值类型也为double。
15
Function<T,R>
接受一个输入参数,返回一个结果。
16
IntBinaryOperator
接受两个参数同为类型int,返回值类型也为int 。
17
IntConsumer
接受一个int类型的输入参数,无返回值。
18
IntFunction<R>
接受一个int类型输入参数,返回一个结果。
19
IntPredicate
:接受一个int输入参数,返回一个布尔值的结果。
20
IntSupplier
无参数,返回一个int类型结果。
21
IntToDoubleFunction
接受一个int类型输入,返回一个double类型结果。
22
IntToLongFunction
接受一个int类型输入,返回一个long类型结果。
23
IntUnaryOperator
接受一个参数同为类型int,返回值类型也为int 。
24
LongBinaryOperator
接受两个参数同为类型long,返回值类型也为long。
25
LongConsumer
接受一个long类型的输入参数,无返回值。
26
LongFunction<R>
接受一个long类型输入参数,返回一个结果。
27
LongPredicate
R接受一个long输入参数,返回一个布尔值类型结果。
28
LongSupplier
无参数,返回一个结果long类型的值。
29
LongToDoubleFunction
接受一个long类型输入,返回一个double类型结果。
30
LongToIntFunction
接受一个long类型输入,返回一个int类型结果。
31
LongUnaryOperator
接受一个参数同为类型long,返回值类型也为long。
32
ObjDoubleConsumer<T>
接受一个object类型和一个double类型的输入参数,无返回值。
33
ObjIntConsumer<T>
接受一个object类型和一个int类型的输入参数,无返回值。
34
ObjLongConsumer<T>
接受一个object类型和一个long类型的输入参数,无返回值。
35
Predicate<T>
接受一个输入参数,返回一个布尔值结果。
36
Supplier<T>
无参数,返回一个结果。
37
ToDoubleBiFunction<T,U>
接受两个输入参数,返回一个double类型结果
38
ToDoubleFunction<T>
接受一个输入参数,返回一个double类型结果
39
ToIntBiFunction<T,U>
接受两个输入参数,返回一个int类型结果。
40
ToIntFunction<T>
接受一个输入参数,返回一个int类型结果。
41
ToLongBiFunction<T,U>
接受两个输入参数,返回一个long类型结果。
42
ToLongFunction<T>
接受一个输入参数,返回一个long类型结果。
43
UnaryOperator<T>
接受一个参数为类型T,返回值类型也为T。

方法引用

方法引用通过方法的名字来指向方法,使用一对冒号  ::  进行标识。

我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,它使得Lambda在调用那些已经拥有方法名的方法的代码更简洁、更容易理解。方法引用可以理解为Lambda表达式的另外一种表现形式。

方法引用的四种方式:

  1. 构造方法引用 格式:Class::new(调用默认无参构造函数)
  2. 类静态方法引用 格式:Class::static_method
  3. 类普通方法引用 格式:Class::method
  4. 实例方法引用 格式:instance::method

StreamAPI

StreamAPI更详细文章在下方文章

https://blog.csdn.net/w8827130/article/details/122764087

接口中的默认方法和静态方法

jdk1.7中接口是只能存在抽象方法,而jdk1.8中可以定义默认实现方法和静态方法。使用Inteface我们能实现面向接口编程,但是接口在实际开发过程中也是有短板的,如在老接口中新增抽象方法,那实现其接口的类都要实现新增的抽象方法,对原有的类影响过大。所以引入了default默认实现,static的用法是直接用接口名调用方法。

public interface TestInteface{

  default String getName(){
    return "zhangsan";
  }

  static String getName2(){
    return "zhangsan";
  }
}

当一个类继承父类又实现接口时,若后两者方法名相同,则优先继承父类中的同名方法,即“类优先”,如果实现两个同名方法的接口,则要求实现类必须手动声明默认实现哪个接口中的方法。如下使用AInterface.super.getName()。

public interface AInterface {
    default String getName(){
        return "A";
    }
}
public interface BInterface {
    default String getName(){
        return "B";
    }
}
public class DClass implements AInterface, BInterface {
    public String getName() {
        return AInterface.super.getName();
    }
}

其它

Optional容器

Optional可以在编译期间检测出NullPointException,避免了运行过程中再出现的问题。

Optional.of(T t); // 创建一个Optional实例,但是Optional.of(null)会直接报空指针
Optional.empty(); // 创建一个空的Optional实例
Optional.ofNullable(T t); // 若T不为null,创建一个Optional实例,否则创建一个空实例
isPresent();    // 判断是够包含值
orElse(T t);   //如果调用对象包含值,返回该值,否则返回T
orElseGet(Supplier s);  // 如果调用对象包含值,返回该值,否则返回s中获取的值
map(Function f): // 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty();
flatMap(Function mapper);// 与map类似。返回值是Optional

参考文章:

JAVA8新特性(吐血整理) - 架构师94 - 博客园

JDK1.8 新特性(全)_随波的博客-CSDN博客_jdk1.8的新特性有哪些

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐