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

时间:2018-03-26 08:17:26

标签: kotlin variadic-functions overloading

我有两个函数检查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处理这种情况?

3 个答案:

答案 0 :(得分:6)

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

fun isBlank(vararg strings: String) : Boolean {
    return strings.isEmpty() || strings.any(::isBlank)
}

这是有效的,因为any需要(T) -> Boolean类型的参数,在这种情况下TString。只有非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() }