在像python和ruby这样的语言中,要求语言它的字符串类支持哪些与索引相关的方法(哪些方法的名称包含单词"index"),你可以做
“”.methods.sort.grep /index/i
Run Code Online (Sandbox Code Playgroud)
而在java中
List results = new ArrayList();
Method[] methods = String.class.getMethods();
for (int i = 0; i < methods.length; i++) {
Method m = methods[i];
if (m.getName().toLowerCase().indexOf(“index”) != -1) {
results.add(m.getName());
}
}
String[] names = (String[]) results.toArray();
Arrays.sort(names);
return names;
Run Code Online (Sandbox Code Playgroud)
你会如何在Scala中做同样的事情?
Dan*_*ral 44
很奇怪没人试过更直接的翻译:
""
.getClass.getMethods.map(_.getName) // methods
.sorted // sort
.filter(_ matches "(?i).*index.*") // grep /index/i
Run Code Online (Sandbox Code Playgroud)
所以,一些随意的想法.
"方法"和上面的箍之间的区别是惊人的,但没有人说过反射是Java的力量.
我隐藏了sorted上面的内容:它实际上采用了类型的隐式参数Ordering.如果我想对方法本身进行排序而不是对其名称进行排序,我必须提供它.
A grep实际上是filter和的组合matches.它变得有点复杂,因为Java决定匹配整个字符串,即使是^和$未指定.我认为有一个grep方法在某种意义上Regex,它Traversable作为参数,但......
那么,这就是我们可以做的事情:
implicit def toMethods(obj: AnyRef) = new {
def methods = obj.getClass.getMethods.map(_.getName)
}
implicit def toGrep[T <% Traversable[String]](coll: T) = new {
def grep(pattern: String) = coll filter (pattern.r.findFirstIn(_) != None)
def grep(pattern: String, flags: String) = {
val regex = ("(?"+flags+")"+pattern).r
coll filter (regex.findFirstIn(_) != None)
}
}
Run Code Online (Sandbox Code Playgroud)
现在这是可能的:
"".methods.sorted grep ("index", "i")
Run Code Online (Sandbox Code Playgroud)
Sai*_*sky 10
您可以使用scala REPL提示符.例如,要查找字符串对象的成员方法列表,请键入"".然后按TAB键(这是一个空字符串 - 如果你愿意,甚至是非空字符串,然后按一个点,然后按TAB键).REPL将为您列出所有成员方法.
这也适用于其他变量类型.
大致相同的方式:
val names = classOf[String].getMethods.toSeq.
filter(_.getName.toLowerCase().indexOf(“index”) != -1).
map(_.getName).
sort(((e1, e2) => (e1 compareTo e2) < 0))
Run Code Online (Sandbox Code Playgroud)
但是全部都在一行上。
为了使其更具可读性,
val names = for(val method <- classOf[String].getMethods.toSeq
if(method.getName.toLowerCase().indexOf("index") != -1))
yield { method.getName }
val sorted = names.sort(((e1, e2) => (e1 compareTo e2) < 0))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18910 次 |
| 最近记录: |