Java的函数满足SICP定义的一等元素的几个判定条件?
Java函数对SICP一等元素判定条件的符合情况
我们默认讨论Java 8及以上版本支持的Lambda函数/函数式接口实例,Java 8之前没有对应函数能力。
SICP给出的一等元素四个判定条件的符合情况如下:
- 条件1:可被变量命名 满足
可以直接将函数赋值给函数式接口类型的变量,示例代码:// 将打印字符串的Lambda函数赋值给printer变量 Consumer<String> printer = s -> System.out.println(s); - 条件2:可作为参数传递给过程 满足
函数可以作为参数传入其他方法,最典型的应用场景就是Stream API调用:// 将转大写的函数作为参数传入map方法 List<String> upperList = strList.stream() .map(s -> s.toUpperCase()) .toList(); - 条件3:可作为过程的返回结果 满足
方法可以直接返回一个函数实例:// 返回一个实现整数倒序比较的函数 public Comparator<Integer> getReverseIntComparator() { return (a, b) -> b - a; } - 条件4:可被纳入数据结构中 存在判定歧义
- 宽松判定(业界常用默认逻辑):满足。只要将函数的载体(函数式接口实例)存入数据结构就算符合要求,这种场景下可以直接把函数存入集合等数据结构:
List<Runnable> taskQueue = new ArrayList<>(); // 直接将函数存入List结构 taskQueue.add(() -> System.out.println("执行定时任务")); - 严格语义判定:不满足。如果要求函数本身是脱离对象独立存在的实体,Java不支持该特性,因为Java中所有Lambda表达式本质上都是函数式接口的实例,始终依附于对象存在,没有完全独立的函数实体。
- 宽松判定(业界常用默认逻辑):满足。只要将函数的载体(函数式接口实例)存入数据结构就算符合要求,这种场景下可以直接把函数存入集合等数据结构:
总结
如果采用通常的宽松判定标准,Java函数4条条件全部满足;如果采用严格的语义判定,仅满足前3条。
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

