我有两个函数检查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处理这种情况?
答案 0 :(得分:6)
您可以使用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
。
答案 1 :(得分:2)
我想有一点问题:目前无法使用vararg
调用null
函数,您只接受String
。无论如何,检查null
都没有意义。您必须将参数strings
更改为vararg strings: String?
类型。另一种解决方案是String?
内的any
:
fun isBlank(vararg strings: String): Boolean {
return strings.isEmpty() ||
strings.any { isBlank(it as String?) }
}
答案 2 :(得分:0)
第二个函数调用自身,因为 it
(在strings.any { isBlank(it) }
中)的类型是String
,这是第二个函数接受的类型。编译器会选择此函数,因为虽然第一个函数也接受String
,但它会收到String?
。
无论如何,你可以拥有这个功能:
fun isBlank(vararg strings: String?)
= strings.any { it == null || it.isEmpty() || it.isBlank() }