lambda 表达式

函数式接口

函数式接口:接口中有且仅有一个抽象方法,可以有其他的静态默认的方法,抽象方法只能有一个。
使用@functionalInterface注解修饰
检查是否是函数式接口

JAVA内置四大核心函数式接口

  • Consumer : 消费型接口
  •      void accept(T t);
    
    Supplier : 供给型接口
  •      T.get();
    
    Function<T,R> : 函数型接口
  •  R apply(T t);
    
    Predicate : 断言型接口
  •  boolean test(T t)
    

lambda基础语法

操作符 ->将lambda表达式分成两部分
左侧:lambda的参数列表(抽象方法的参数列表)
右侧:lambda所需执行的功能,即lambda体(对抽象方法的实现)

语法格式

格式一:无参数,无返回值

  • () -> system.out.println("hello")
    

格式二:有一个参数,并且无返回值

  • (c) -> System.out.println(c)
    

格式三: 若只有一个参数,小括号可以不写

  •  c -> System.out.println(c)
    

格式四: 有两个以上参数,有返回值,且lambda体中有多条语句

       Comparator<Integer> com = (o1, o2) -> {
             System.out.println("函数式接口");
             return Integer.compare(o1,o2);
         };

格式五:若lambda体中只有一条语句,return 和大括号都可以省略不写

  • Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
    

格式六:lambda 表达式的参数列表的数据类型可以省略不写,因为
jvm编译器通过上下文推断出数据类型,即类型推断

总结: 左右遇一括号省,左侧推断类型省
在局部内部类中应用一个同级别的局部变量
JDK1.7之前必须是final的
JDK1.8之后final可以不加但它还是final的

方法引用

方法引用:若lambda体中的内容有方法已经实现了,我们可以使用方法引用(方法引用lambda表达式的另一种形式)
语法格式:
实例 ::实例方法名

 @Test
   public void test2(){
       BiPredicate<String,String> bp = (x,y) -> x.equals(y);
       BiPredicate<String,String> bp2 = String::equals;
   }

类名 ::静态方法名

@Test
   public void test1(){
       //类名:: 静态方法名
       Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
       Comparator<Integer> com1 = Integer::compareTo;
   }

类名 ::实例方法名

 @Test
   public void test(){
       //实例::实例方法名
       Consumer<String> con = (x) -> System.out.println(x);
       Consumer<String> con1 = System.out::println;
   }

注意事项:
1 lambda体中调用方法的参数列表和返回值类型,要与函数式接口中抽象方法的参数列表与返回值类型保持一致
2 若lambda参数列表中的第一个参数是实例方法的调用者,第二个参数是实例方法的参数时可以使用类名::实例方法

构造器引用

格式:类名 ::new

 @Test
   public void test3(){
       Supplier<Student> sup = () -> new Student();
       //构造器引用
       Supplier<Student> sup2 = Student::new;
       Student student = sup2.get();
       System.out.println(student);
   }

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

数组引用

格式:Type[] ::new

//数组引用
   @Test
   public void Test4(){
       Function<Integer,String[]> fun = length -> new String[length];
       String[] arr = fun.apply(5);
       System.out.println(Arrays.toString(arr));
       Function<Integer,String[]> fun1 = String[]::new;
       String[] arr1 = fun1.apply(2);
       System.out.println(Arrays.toString(arr1));
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值