Java8 特性-Lambda 表达式①
-
Lambda格式:
- ()-> {} 这里是基本格式,()为参数集合;而{} 则为方法体。在该表达式中,如果调用的接口没有参数,那么就用空括号表示‘()’,->只是Lambda格式,如果方法体中只有一行代码,默认省略{}方法体写法,同事省略return语句,直接将结果返回,没有返回值则返回null为void;
- ()->{} :没有参数且返回值为void
- ()-> "字符串" :没有参数,返回字符串结果;
- (String s1,String s2)->{if(s1.equals(s2)) return true;else return false}:方法有两个参数都是String类型,进行值对比,返回boolean结果;
- 这里是类库中提供的默认函数式接口;
函数式接口 | 参数类型 | 返回类型 | 描述 |
---|---|---|---|
Supplier | 无 | T | 接收一个T类型的值 |
Consumer | T | 无 | 处理一个T类型的值 |
BiConsumer<T, U> | T,U | 无 | 处理T类型和U类型的值 |
Predicate | T | boolean | 处理T类型的值,并返回true或者false. |
ToIntFunction | T | int | 处理T类型的值,并返回int值 |
ToLongFunction | T | long | 处理T类型的值,并返回long值 |
ToDoubleFunction | T | double | 处理T类型的值,并返回double值 |
Function<T, R> | T | R | 处理T类型的值,并返回R类型值 |
BiFunction<T, U, R> | T,U | R | 处理T类型和U类型的值,并返回R类型值 |
BiFunction<T, U, R> | T,U | R | 处理T类型和U类型的值,并返回R类型值 |
UnaryOperator | T | T | 处理T类型值,并返回T类型值, |
BinaryOperator | T,T | T | 处理T类型值,并返回T类型值 |
-
调用自定义函数接口
- 函数式接口只需要关注参数和返回值就好,如果类库中已经存在,最好使用类库中的函数接口;
- 换一种思想,可以当作Lambda表达式是接口的抽象方法实现就好,最基本的我们可以写实现类,或者用匿名函数实现,有了Lambda我们可以用它实现,也就是想接口传递了一个实现方法而已;
例子①
- 该函数式接口参数为任意类型,但是返回值必须为字符串,Lambda格式为(T t)-> {return "字符串";}
package com.interfaces;
@FunctionalInterface
public interface LambdaInterface<T> {
String test01(T t);
}
- 解释:
- (String s) -> s.toUpperCase(),满足函数式接口需求,参数一个任意类型,这里给的是String;
- 方法体只有一行代码,默认省略return语句,直接返回结果,是String类型数据大写,返回String;
- stringLambdaInterface.test01( "hello lambda!" ),直接调用接口并传参;
public static void main(String[] args) {
LambdaInterface<String> stringLambdaInterface = (String s) -> s.toUpperCase();
String result = stringLambdaInterface.test01( "hello lambda!" );
System.out.println(result);
}
- 测试结果:
例子②
- 该自定义函数式接口有两个参数,一个是任意类型,另一个为String,返回boolean;
- Lambda表达式为(T t,String str)->{return boolean;}
package com.interfaces;
@FunctionalInterface
public interface LambdaInterface2<T> {
boolean test01(T t,String s);
}
- 解释:
- (Object o1, String s2) -> o1.toString().equals( s2 ),该表达式有两个参数,Object和String;
- 通过比较值,返回比较结果,equals方法返回boolean;
public static void main(String[] args) {
LambdaInterface2<Object> objectLambdaInterface2 = (Object o1, String s2) -> o1.toString().equals( s2 );
boolean result = objectLambdaInterface2.test01( "sss", "sss" );
System.out.println(result);
}
- 运行结果:
- 通过上面的例子,接口是函数就是有且只有一个的抽象方法的接口,然后不需要实现类去实现方法体,根据业务逻辑,随时需要随时用Lambda表达式随时实现业务逻辑细节,用返回对象调用函数是接口时,其中经历的业务处理则是刚刚用Lambda表达式写的逻辑
chenyb 随笔记录,只为方便自己学习
2019-10-15