Scala flatMap基于getConstructors方法(反射)



我正在尝试使用反射迭代给定类的构造函数。问题是我需要对每个元素做一些事情,然后只返回与某个谓词匹配的元素。下面的代码抛出异常

classOf[String].getConstructors.flatMap(x=> doSomething(x); if(predicate(x)) Some(x) else None)

例外:

argument expression's type is not compatible with formal parameter type;
 found   : java.lang.reflect.Constructor[_] => Iterable[java.lang.reflect.Constructor[?0(in value $anonfun)]] forSome { type ?0(in value $anonfun) }
 required: java.lang.reflect.Constructor[_] => scala.collection.GenTraversableOnce[?B]

我不确定这是否可以通过理解来完成,因为我需要在每个元素上调用做一些事情(不仅仅是对于那些持有谓词的元素):

for{
    x <- c.getConsturctors
    //doSomething(x) ?? 
    if predicate(x)
}yield{
    //doSomething(x) - only for the ones that holds the predicate
    x
}

调用c.getMethods工作,所以我猜它有一些与返回类型(数组[方法]vs数组[构造函数[_]])…?

答案:

flatMap - Alexey Romanov答案

用于理解(在pamu的帮助下):

for{
    x <- c.getConsturctors
    _ = doSomething(x)
    if predicate(x)
}yield x

由于类型推断实现的细节,Scala最终以Iterable[java.lang.reflect.Constructor[A]] forSome { type A }结束,而您想要Iterable[java.lang.reflect.Constructor[A] forSome { type A }](或更短,Iterable[java.lang.reflect.Constructor[_]])。注释类型应该工作:

c.getConstructors.flatMap { x =>
  doSomething(x)
  (if (predicate(x)) Some(x) else None): Option[Constructor[_]]
}

但我必须承认我不明白为什么会出现问题

使用collect代替flatMap,然后返回Some, None

classOf[String].getConstructors.toList
  .collect { case elem if predicate(elem) => doSomething(elem) }
使用flatMap

classOf[String].getConstructors.toList.flatMap { elem =>
  doSomething(elem);
  if (predicate(elem)) {
    List(elem)
  } else List()
}
使用对于理解

for {
 elem <- classOf[String].getConstructors.toList
 _ = doSomething(elem)
 val result = if (predicate(elem) List(elem) else List()
} yield result

相关内容

  • 没有找到相关文章

最新更新