180817-函数式接口

函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

一、什么是函数式接口?

  1. 只包含一个抽象方法的接口,称为函数式接口。
  2. 、你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。
  3. 我们可以在任意函数式接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。

二、自定义函数

示例代码一:

1
2
3
4
@FunctionalInterface
public interface MyNumber{
public double getValue();
}

示例代码二:函数式接口中使用泛型

1
2
3
4
@FunctionalInterface
public interface MyFunc<T>{
public T getValue(T t);
}

三、作为参数传递Lambda表达式

示例代码:

1
2
3
4
5
6
7
public String strHandler(String str, MyFunction mf) {
return mf.getValue(str);
}
作为参数传递Lambda表达式:
String trimStr = strHandler("\t\t 哈哈 ", (str) -> str.trim());
String upperStr = strHandler("abcdefg", (str) -> str.toUpperCase());
String newStr = strHandler("哈哈哈哈哈哈", (str) -> str.substring(2, 5));

作为参数传递Lambda表达式:为了将Lambda表达式作为参数传递,接收Lambda表达式的参数类型必须是与该Lambda表达式兼容的函数式接口的类型。

四、Java内置四大核心函数式接口

在学习lambda表达式的时候,我们知道,要使用lambda表达式,我们就要创建一个函数式接口,那每次用lambda表达式的时候岂不是很麻烦,这时候,java给我们内置了四大核心函数式接口。

函数式接口 参数类型 返回类型 用途
Consumer<T> T void 对类型为T的对象应用操作,包含方法 void accept(T t)
Supplier<T> T 返回类型为T的对象,包含方法: T get();
Function<T,R> T R 对类型为T的对象应用操作,并返回结果。结果为R类型的对象,包含访问 R apply(T t)
Predicate<T> T boolean 确定类型为T的对象是否满足某约束,并返回boolean值,包含方法 boolean test(T t)
BiFunction<T,U,R> 对类型为T,Uc参数应用操作,返回R类型的结果,包含方法为: R apply(T t ,U u);

五、四大接口示例

Consumer<T>,消费型接口

Consumer<T> : 消费型接口,void accept(T t);

代码示例:

1
2
3
4
5
6
7
@Test
public void consumerTest() {
happy(1000, m -> System.out.println("大保健花了:" + m));
}
public void happy(double money, Consumer<Double> con) {
con.accept(money);
}

Supplier<T>,供给型接口

Supplier<T> : 供给型接口,T get();

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void supplierTest() {
List<Integer> list = getNumList(10, () -> (int) (Math.random() * 100));
list.forEach(System.out::println);
}

public List<Integer> getNumList(int num, Supplier<Integer> sup) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
Integer n = sup.get();
list.add(n);
}
return list;
}

Function<T, R> : 函数型接口

Function<T, R> : 函数型接口,R apply(T t);

示例代码:

1
2
3
4
5
6
7
8
9
10
11
@Test
public void functionTest() {
String trimStr = strHandler("\t\t 你好,world! ", (str) -> str.trim());
System.out.println(trimStr);
String sumString = strHandler("Helloworld!", (str) -> str.substring(2, 4));
System.out.println(sumString);
}

public String strHandler(String str, Function<String, String> func) {
return func.apply(str);
}

Predicate<T> : 断言型接口

Predicate<T> : 断言型接口,boolean test(T t);

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
public void predicateTest() {
List<String> list = Arrays.asList("Hello", "world", "hi", "o", "123");
List<String> filterStr = filterStr(list, (str) -> str.length() > 1);
for (String string : filterStr) {
System.out.println(string);
}
}

//需求:将满足条件的字符串,放入集合中
public List<String> filterStr(List<String> list, Predicate<String> pre) {
List<String> list2 = new ArrayList<>();
for (String str : list) {
if (pre.test(str)) {
list2.add(str);
}
}
return list2;
}

参考资料

函数式接口

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×