经常看到使用@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())));
    }
    }
}

总结:何时需要定义一个函数式接口呢?我的理解是和上面的场景差不多,那就是对特定数据,你可能要支持任意种操作的时候,如果使用实现接口,你可能要实现很多接口,比较繁琐,而使用函数式接口,则不用。


Martin
5 声望0 粉丝

后端