java - 将 null 函数作为参数传递给 java 函数
问题描述
我在理解函数如何作为参数传递给方法时遇到了问题。
在 StackOverflow 和 StackExchange 上搜索让我找到了一个使用java.util.Functions
public void someFunction(Functions <int[], int[]> myFunction);
(来源:https ://codereview.stackexchange.com/questions/186972/passing-a-generic-function-as-parameter )
虽然这个解决方案对我来说似乎不错,但当我需要传递一个什么都不做的函数时,我遇到了问题。为了更好地理解,请考虑以下示例:
public class Example {
//do stuffs
myFunction(null);
}
public class Manager {
public void myFunction(Function<int[], void> funcToPass) { // Can't specify void as return value!
//do stuff
if(funcToPass != null) { // can't replicate such behaviour
funcToPass(someParams)
}
}
}
有人可以帮助我清楚地了解这个主题吗?太感谢了。
解决方案
如果要描述一个不返回值的函数,可以使用Void
类型。这是一个标准的 Java 类,但旨在用于这种情况。
例如
Function<String, Void> stringPrinter = s -> {
System.out.println(s);
return null; // must return some value, null is acceptable since there is no Void instance
};
很重要,return null;
因为从编译器的角度来看,Void
它就像任何其他类(例如String
、Integer
等)。它不知道它表示没有值,但它知道返回的函数void
没有返回值。
这意味着编译器仍然期望return
您的代码中有一些语句,就像它返回一个Integer
,所以你必须return null;
编辑:
但是,您可能会发现,如果您严格处理没有返回的函数,则更适合使用Consumer<T>
. 例如:
Consumer<String> stringPrinter = s -> System.out.println(s);
stringPrinter.accept("hello");
或者,使用方法参考:
Consumer<String> stringPrinter = System.out::println;
stringPrinter.accept("hello");
推荐阅读
- firebase - 状态小部件 initState() 未在 ListView 内命中
- python-3.x - 在 SQLALCHEMY 和烧瓶中排序和删除一对多关系
- php - 按图像过滤产品 Woocommerce 管理员
- javascript - 来自反应js中的组件的图像
- reactjs - React MaterialUI - 如何禁用选择元素的波纹效果
- angular - 没有导航的 Angular 12 组件
- python - 如何防止错误:ModelAdmin.autocomplete_fields 中的 403?
- flutter - StateNotifierProvider:是否可以使用单个 StateNotifierProvider 控制表单中不同小部件的值
- datatables - 插件数据表在 Laravel 8 中不起作用
- powershell - Powershell - 如果不是多个组的成员,则将用户从 OU 广告到安全组