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() }