关于程序员:Lambda表达式和函数式接口

4次阅读

共计 2436 个字符,预计需要花费 7 分钟才能阅读完成。

1. Lambda 表达式的根本语法

Java8 中引入了一个新的操作符 “->” 该操作符称为箭头操作符或 Lambda 操作符 箭头操作符将 Lambda 表达式拆分成两局部:
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式中所需执行的性能,即 Lambda 体
比方咱们应用 Comparator 的时候,以前是应用匿名外部类的形式,当初咱们能够应用 Comparator<Integer> com = (x, y) -> Integer.compare(x, y); 的形。
其中,(x,y)是输出的参数,他们的参数类型能够省略不写,因为会依据后面的 Integer 进行类型推断。前面的办法体因为只有一句所以也省略 {}, 而后 return 也能够省略。
其残缺写法是:

Comparator<Integer> com = 
              (Integer x,Integer y) -> {return Integer.compare(x, y);};

2. 函数式接口

只蕴含一个形象办法的接口,称为函数式接口。在 java8 中,函数式接口会被 @FunctionalInterface 注解。
Lambda 表达式的应用是须要函数式接口的反对。
在 jdk8 中,接口中办法是能够应用 default 润饰的办法实现,这个办法不会影响该接口成为函数式接口。
案例:

# 自定义一个函数式接口
@FunctionalInterface
public interface MyFun {public Integer getValue(Integer num);
}
#
public void test6(){Integer num = operation(100, (x) -> x * x);
    System.out.println(num);        
    System.out.println(operation(200, (y) -> y + 200));
}
    
public Integer operation(Integer num, MyFun mf){return mf.getValue(num);
    }
}

2.1 java 内置的四大外围函数式接口

Consumer<T> : 消费型接口,对类型为 T 的对象利用操作

    void accept(T t);

Supplier<T> : 供应型接口,返回类型为 T 的对象

   T get(); 

Function<T, R> : 函数型接口,对类型为 T 的对象进行操作,返回类型为 R 的对象

     R apply(T t);

Predicate<T> : 断言型接口,确定类型为 T 的对象是否满足某束缚

     boolean test(T t);

当然这四个接口还衍生出很多子接口。

3. 办法援用

当要传递 Lambda 体的操作,曾经有实现的办法了,就能够应用办法援用!(办法援用所应用办法的入参和返回值与 lambda 表达式实现的函数式接口的入参和返回值统一。) 能够将办法援用了解为 Lambda 表达式的另外一种表现形式

办法援用就是应用 :: 操作符将把对象或者类的名字和办法名连接起来。有一下三种应用状况:

  • 对象的援用 :: 实例办法名
Employee emp = new Employee(101, "张三", 20, 9999);
#Lambda 表达式
Supplier<String> sup = () -> emp.getName();
System.out.println(sup.get());
#办法援用
Supplier<String> sup2 = emp::getName;
System.out.println(sup2.get());
  • 类名 :: 静态方法名
#Lambda 表达式
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
#办法援用
Comparator<Integer> com2 = Integer::compare;
  • 类名 :: 实例办法名

Lambda 的参数列表的第一个参数,是实例办法的调用者,第二个参数 (或无参) 是实例办法的参数时, 格局ClassName::MethodName

#Lambda 表达式
BiPredicate<String, String> bp = (x, y) -> x.equals(y);
System.out.println(bp.test("abcde", "abcde"));
#办法援用
BiPredicate<String, String> bp2 = String::equals;
System.out.println(bp2.test("abc", "abc"));

#Lambda 表达式
Function<Employee, String> fun = (e) -> e.show();
System.out.println(fun.apply(new Employee()));
#办法援用
Function<Employee, String> fun2 = Employee::show;
System.out.println(fun2.apply(new Employee()));

4. 结构器援用

前提:结构器援用 : 结构器的参数列表,须要与函数式接口中参数列表保持一致
应用:类名 :: new

#Lambda 表达式
Supplier<Employee> sup = () -> new Employee();
System.out.println(sup.get());    
#结构器援用
Supplier<Employee> sup2 = Employee::new;
System.out.println(sup2.get());

5. 数组援用

应用:type[] new

# Lambda 表达式
Function<Integer, String[]> fun = (args) -> new String[args];
String[] strs = fun.apply(10);
System.out.println(strs.length);    
数组援用
Function<Integer, Employee[]> fun2 = Employee[] :: new;
Employee[] emps = fun2.apply(20);
System.out.println(emps.length);
正文完
 0