avatar

java8新特性 —— 函数式接口

函数式接口

是Java8引用的一个新特性,它是一个比较特殊的接口定义,接口中只有一个 抽象方法。主要是为了搭配 Lambda来使用。

  • 接口中只有一个抽象方法
  • 使用 @FunctionalInterface 标记
  • 接口中可以存在静态方法和默认方法
  • 默认方法可以被重写
  • 可以被继承,但抽象方法必须相同

如何定义

以下就是一个最简单的自定义函数接口:

1
2
3
4
5
6
7
8
9
@FunctionalInterface
public interface MyFunctionInterface<F, T> {
T getFileName(F from);
}

//调用
public void getFileName() {
MyFunctionInterface myFunctionInterface = from -> System.currentTimeMillis() + "." + from; System.out.println(myFunctionInterface.getFileName("txt"));
}

内置核心函数式接口

  • Consumer :消费型接口

    ​ void accept(T t);

  • Supplier :供给型接口

    ​ T get();

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

    ​ R apply(T t);

  • Predicate :断言型接口

    ​ boolean test(T t);

Consumer

没有返回值

1
2
3
4
5
6
7
8
9
@Test
public void recordConsum() {
consum(100.60, money -> System.out.println("本次共消费:" + money + "元"));
// 本次共消费:100.6元
}

public void consum (double money, Consumer consumer) {
consumer.accept(money);
}

Supplier

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

public List<Integer> getNumbers(int numberCount, Supplier<Integer> supplier) {
List<Integer> list = new ArrayList<>(numberCount);
for(int i = 0; i < numberCount; i++) {
list.add(supplier.get());
}
return list;
}
文章作者: 惆怅客
文章链接: https://www.songhailong.com/articles/613a01e4/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 惆怅客

评论