在Scala中组合find和instanceof的任何干净方法?
发布时间:2020-12-16 18:26:00 所属栏目:安全 来源:网络整理
导读:我想在一些Iterable中找到一些符合某些给定类型的元素,并验证将该类型作为参数的谓词. 我使用命令式编程编写了这个方法,这似乎符合我的期望.有没有办法用更“scalaesque”的方式写这个? def findMatch[T](it: Iterable[_],clazz: Class[T],pred: T = Boolea
我想在一些Iterable中找到一些符合某些给定类型的元素,并验证将该类型作为参数的谓词.
我使用命令式编程编写了这个方法,这似乎符合我的期望.有没有办法用更“scalaesque”的方式写这个? def findMatch[T](it: Iterable[_],clazz: Class[T],pred: T => Boolean): Option[T] = { val itr = it.iterator var res: Option[T] = None while (res.isEmpty && itr.hasNext) { val e = itr.next() if (clazz.isInstance(e) && pred(clazz.cast(e))) { res = Some(clazz.cast(e)) } } res } 解决方法
如果将问题划分为子问题,则很容易找到更惯用的版本.
你想要 >在你的Iterable [Any]中找到T的所有实例 对于第一点,您可以轻松地在迭代器上使用过滤器方法.所以你有了 it.iterator.filter(x => clazz.isInstance(x)) 它返回一个只包含Ts的Iterator [Any].现在让我们说服编译器: it.iterator.filter(x => clazz.isInstance(x)).map(x => x.asInstanceOf[T]) 好的,现在你有了一个Iterator [T] – 所以你只需要找到第一个完成谓词的元素: def findMatch[T](it: Iterable[Any],pred: T => Boolean): Option[T] = it.iterator.filter(x => clazz.isInstance(x)) .map(x => x.asInstanceOf[T]) .find(pred) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |