经常看到使用@FunctionalInterface定义的接口,那么何时在项目中去定义一个这样的接口呢?
假设我定义了一个名字服务接口。
@FunctionalInterface
public interface NameService {
void service(String name);
}
现在的问题是,我希望在不同的场合打印不同的字符串,甚至加一些修饰。
比如我想把name以大写的形式打印出来,或者以小写,或者加一个"hello"。
传统的方式,需要提供NameService的多个实现类,然后传给testService()。
而使用FunctionalInterface,可以减去实现类,直接传入函数。就像下面这样:
public class TestNameService {
public static void testService(List<String> names, NameService service) {
for (String name : names) {
service.service(name);
}
}
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("java");
names.add("c");
names.add("c++");
testService(names, (target -> System.out.println("hello:" + target)));
testService(names, (target -> System.out.println("hello:" + target.toLowerCase())));
testService(names, (target -> System.out.println("hello:" + target.toUpperCase())));
}
}
}
总结:何时需要定义一个函数式接口呢?我的理解是和上面的场景差不多,那就是对特定数据,你可能要支持任意种操作的时候,如果使用实现接口,你可能要实现很多接口,比较繁琐,而使用函数式接口,则不用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。