Kotlin函数重载(varargs vs单参数)

nll*_*dfx 1 overloading variadic-functions kotlin

我有两个函数检查String/Strings是否为空.

fun isBlank(s: String?) : Boolean {
            return s.isNullOrBlank()
        }

fun isBlank(vararg strings: String) : Boolean {
            return strings.isEmpty() ||
                    strings.any { isBlank(it) }
        }
Run Code Online (Sandbox Code Playgroud)

所以我尝试从第二个函数调用第一个函数,但似乎它试图调用自己.例如,它在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);
}
Run Code Online (Sandbox Code Playgroud)

如何在kotlin处理这种情况?

zsm*_*b13 6

您可以使用函数引用执行与Java相同的操作,如下所示:

fun isBlank(vararg strings: String) : Boolean {
    return strings.isEmpty() || strings.any(::isBlank)
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为any需要一个类型的参数(T) -> Boolean,T在这种情况下是String.只有非vararg函数有这种类型,vararg实际上函数的类型(Array<out String>) -> Boolean.