Java 获取高阶函数中函数参数的名称

Java 获取高阶函数中函数参数的名称,java,android,reflection,kotlin,introspection,Java,Android,Reflection,Kotlin,Introspection,Kotlin似乎不支持获取本地函数等。请参见以下示例: fun <T> MutableList<T>.filterOnCondition(condition: (T) -> Boolean): MutableList<T> { // For the printline, trying to get the function name, // which in this case is passedAsCondition pri

Kotlin似乎不支持获取本地函数等。请参见以下示例:

fun <T> MutableList<T>.filterOnCondition(condition: (T) -> Boolean): MutableList<T>
{ 
    // For the printline, trying to get the function name, 
    // which in this case is passedAsCondition
    println(condition.reflect()!!.instanceParameter!!.name)
}

fun passedAsCondition (number: Int, multipleOf : Int): Boolean
{
    return number % multipleOf == 0
}

numbers.filterOnCondition { passedAsCondition(it, 5) }
fun可变列表.filterOnCondition(条件:(T)->Boolean):可变列表
{ 
//对于打印行,尝试获取函数名,
//在这种情况下,这是通过的条件
println(condition.reflect()!!.instanceParameter!!.name)
}
fun passedAsCondition(number:Int,multipleOf:Int):布尔值
{
返回编号%multipleOf==0
}
numbers.filterOnCondition{passedAsCondition(it,5)}
Kotlin返回此错误,因为它尚未映射:

“kotlin.reflect.jvm.internal.KotlinReflectionInternalError: 内省局部函数、lambda、匿名函数和局部函数 Kotlin反射中尚未完全支持变量”

()


但是,这当然可以通过Java实现,不是吗?

这是一个匿名函数,因此它的名称将是

作为结果,利用适当的反射,以下工作:

fun main(args: Array<String>) {
    mutableListOf(1).filterOnCondition(::passedAsCondition)
}


fun <T> MutableList<T>.filterOnCondition(
    condition: KFunction2<@ParameterName(name = "number") Int, @ParameterName(name = "multipleOf") Int, Boolean>
) {
    println(condition.name)
}

fun passedAsCondition(number: Int, multipleOf: Int): Boolean = number % multipleOf == 0
fun main(args:Array){
可变列表(1).filterOnCondition(::passedAsCondition)
}
fun MutableList.filterOnCondition(
条件:KFunction2
) {
println(条件名称)
}
fun passedAsCondition(number:Int,multipleOf:Int):布尔值=number%multipleOf==0

我可以编写
数组.asList(5,6,10,13,15,24).stream().filter(x->x%5==0).forEachOrdered(System.out::println)-不确定你在问什么。。。关于将函数传递给filter?我正在尝试获取传递到filterOnCondition的函数的名称。对于println(),我希望看到passedAsCondition返回。@Lander,您正在反思lambda
passedAsCondition
位于lambda正文中。谢谢,s1m0nw1。我对科特林很陌生。有可能从lambda中获取passedAsCondition的函数名吗?FWIW,如果这个问题听起来不太正统,实际上可以在C#中这样做,在C#中,传递属性名时不使用硬编码字符串是很常见的。例如@chris所指的:@s1m0nw1:我明白了,但是,您不会失去将参数传递到passedAsCondition的功能吗?您仍然可以调用该函数,但需要将参数作为额外参数传递,但它很快就会变丑。你的用例是什么
fun x(a: Int): Boolean {
    passedAsCondition(a, 5)
    return true
}
println(::x.name) //gives x
fun main(args: Array<String>) {
    mutableListOf(1).filterOnCondition(::passedAsCondition)
}


fun <T> MutableList<T>.filterOnCondition(
    condition: KFunction2<@ParameterName(name = "number") Int, @ParameterName(name = "multipleOf") Int, Boolean>
) {
    println(condition.name)
}

fun passedAsCondition(number: Int, multipleOf: Int): Boolean = number % multipleOf == 0