Java8的新特性(一)

一个匿名函数,一段可像数据一样传递的代码,写出更简洁、更灵活、更紧凑的代码,使Java的语言表达能力得到提升。语法糖。

Java8中引入了一个新的操作符“->”,箭头操作符或lambda操作符

表达式拆分成两部分

左侧:lambda 表达式的参数列表

右侧:lambda表达式中所需要执行的功能

原来是匿名内部类,现在是抽象方法的实现

函数式接口:

Lambda表达式,需要函数式接口的支持,

​ 即接口中只有一个抽象方法的接口

​ 可以使用@FunctionalInterface修饰,可以检查是否为函数式接口

  1. 语法格式一:无参数,无返回值

​ () -> System.out.println(“Lambda”);

Jdk1.7版本,局部内部类使用了局部变量,变量必须是final

jdk1.8版本不用加,已经设置成final

  1. 语法格式二:有一个参数,无返回值
Consumer<String> com = (s) -> System.out.println(s);
com.accept("Lambda");
  1. 语法格式三:若只有一个参数,小括号可以不写
Consumer<String> com = s -> System.out.println(s);
com.accept("Lambda");
  1. 有两个以上参数,有返回值,并且Lambda体中有多条语句,必须使用大括号
Consumer<String> com = (x,y) -> {    System.out.println("Lambda");    
 return Integer.compare(x,y);
};
  1. 语法格式五:若lambda体中只有一条语句,return和大括号都可以省略不写
Comparator<Integer> com = (x, y) ->  Integer.compare(x,y);
  1. 语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出数据类型,即“类型判断”

    (Integer x,Integer y) ->  Integer.compare(x,y);
    
  2. 左侧一个参数可以省略(),右侧一个语句可以省略{}

    左侧有数据类型,右侧可以省

Java8内置的四大核心函数式接口

  1. Consumer:消费型接口 void accept(T t)无返回值,直接执行的方法

  2. Supplier:供给型接口 T get();无参,用于产生一些数据的方法

  3. Fuction<T,R>:函数型接口 R apply(T t)传T返回R

  4. Predicate:断言型接口 Boolean test(T t)传T返回Boolean

  5. 其他接口:

    BiFunction<T,U,R> 两个参数,一个返回值

    UnaryOperator(Function子接口) ,对T类型对象,进行一元运算并返回T类型结果,包含方法为: T apply(T t)

    BiaryOperator(BiFunction子接口) ,两个同类型参数,对T类型对象,进行二元运算并返回T类型结果,包含方法为: T apply(T t1,T t2)

    BiConsumer<T,U>,对类型T,U进行操作,包含方法为: T apply(T t1,U u1)

方法引用和构造器引用

方法引用:若Lambda体中的内容方法已经实现了,我们可以使用方法引用

方法引用是Lambda表达式的另外一种表现形式

注意: Lambda 体中,调用方法的参数列表与返回值类型,

要与函数式接口中抽象方法的参数列表和返回值类型保持一致

主要有三种语法格式:

  1. 对象::实例方法名,
  2. 类::静态方法名
/**@Description 类::静态方法名  */
@Testpublic void testThree() {    
    Comparator<Integer> com =(x,y)->Integer.compare(x,y); 
    //相同方法,后续可以 :: 直接使用    
    Comparator<Integer> com1 =Integer::compareTo;}
  1. 类::实例方法名

当Lambda 参数列表中的第一参数 是实例方法的调用者,而第二个参数是实例方法的 使用参数时,可以使用 ClassName::methed

构造器引用

格式:ClassName ::new

注意:不传参数就无参构造器,传什么参数就什么类型参数的构造器

需要调用的构造器的参数列表,要与函数式接口中的抽象方法的参数列表保持一致

Supplier<Employee> emp = () -> new Employee();
//**构造器引用**
//函数式接口的,抽象方法的参数列表,自动匹配构造器,Supplier.get()方法无参数
Supplier<Employee> emp2 = Employee::new;
//自动构造无参方法
Employee employee =emp2.get();
System.out.println("employee = " + employee);

Function<Integer, Employee> func = x -> new Employee();

//**构造器引用**
//有参构造
Function<Integer, Employee> emp2 = Employee::new;
Employee employee = emp2.apply(101);
System.out.println("employee = " + employee);
//两个参数进行构造
BiFunction<Integer, Integer, Employee> bif =Employee::new;

数组引用
Type::new

Function<Integer, String[]> func = x -> new String[x];
String[] apply = func.apply(10);
System.out.println("apply = " + apply.length);
Function<Integer,String[]> func2 =String[]::new;
String[] apply1 = func2.apply(20);
System.out.println("apply1 = " + apply1.length);
展开阅读全文
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值