Kotlin 函数重载(可变参数与单个参数)
Kotlin function overloading (varargs vs single parameter)
我有两个函数检查 String/Strings 是否为空。
fun isBlank(s: String?) : Boolean {
return s.isNullOrBlank()
}
fun isBlank(vararg strings: String) : Boolean {
return strings.isEmpty() ||
strings.any { isBlank(it) }
}
所以我尝试从第二个函数调用第一个函数,但它似乎试图调用自身。例如,它在 java:
中运行良好
public static boolean isBlank(final String string) {
return string == null || string.trim().isEmpty();
}
public static boolean isBlank(final String... strings) {
return strings.length == 0
|| Arrays.stream(strings).anyMatch(StringUtil::isBlank);
}
在kotlin中如何处理这种情况?
您可以使用 function reference 执行与 Java 中相同的操作,看起来像这样:
fun isBlank(vararg strings: String) : Boolean {
return strings.isEmpty() || strings.any(::isBlank)
}
这是可行的,因为 any
需要类型为 (T) -> Boolean
的参数,T
在这种情况下为 String
。只有非vararg
函数才有这个类型,vararg
函数的类型实际上是(Array<out String>) -> Boolean
.
有一点问题,我猜:vararg
函数目前不能用null
调用,你只接受String
。检查 null
无论如何都没有意义。您必须将参数 strings
更改为类型 vararg strings: String?
。另一种解决方案是在 any
:
中转换为 String?
fun isBlank(vararg strings: String): Boolean {
return strings.isEmpty() ||
strings.any { isBlank(it as String?) }
}
第二个函数调用自身是因为it
(在strings.any { isBlank(it) }
中)的类型是String
,也就是第二次的类型功能接受。编译器选择这个函数是因为,尽管第一个函数也接受 String
,但它接收 String?
.
总之,你可以只拥有这个功能:
fun isBlank(vararg strings: String?)
= strings.any { it == null || it.isEmpty() || it.isBlank() }
我有两个函数检查 String/Strings 是否为空。
fun isBlank(s: String?) : Boolean {
return s.isNullOrBlank()
}
fun isBlank(vararg strings: String) : Boolean {
return strings.isEmpty() ||
strings.any { isBlank(it) }
}
所以我尝试从第二个函数调用第一个函数,但它似乎试图调用自身。例如,它在 java:
中运行良好public static boolean isBlank(final String string) {
return string == null || string.trim().isEmpty();
}
public static boolean isBlank(final String... strings) {
return strings.length == 0
|| Arrays.stream(strings).anyMatch(StringUtil::isBlank);
}
在kotlin中如何处理这种情况?
您可以使用 function reference 执行与 Java 中相同的操作,看起来像这样:
fun isBlank(vararg strings: String) : Boolean {
return strings.isEmpty() || strings.any(::isBlank)
}
这是可行的,因为 any
需要类型为 (T) -> Boolean
的参数,T
在这种情况下为 String
。只有非vararg
函数才有这个类型,vararg
函数的类型实际上是(Array<out String>) -> Boolean
.
有一点问题,我猜:vararg
函数目前不能用null
调用,你只接受String
。检查 null
无论如何都没有意义。您必须将参数 strings
更改为类型 vararg strings: String?
。另一种解决方案是在 any
:
String?
fun isBlank(vararg strings: String): Boolean {
return strings.isEmpty() ||
strings.any { isBlank(it as String?) }
}
第二个函数调用自身是因为it
(在strings.any { isBlank(it) }
中)的类型是String
,也就是第二次的类型功能接受。编译器选择这个函数是因为,尽管第一个函数也接受 String
,但它接收 String?
.
总之,你可以只拥有这个功能:
fun isBlank(vararg strings: String?)
= strings.any { it == null || it.isEmpty() || it.isBlank() }