在我第一次尝试创建功能代码时,我遇到了性能问题.
我从一个共同的任务开始 - 将两个数组的元素相乘并总结结果:
var first:Array[Float] ...
var second:Array[Float] ...
var sum=0f;
for (ix<-0 until first.length)
sum += first(ix) * second(ix);
Run Code Online (Sandbox Code Playgroud)
以下是我改革工作的方式:
sum = first.zip(second).map{ case (a,b) => a*b }.reduceLeft(_+_)
Run Code Online (Sandbox Code Playgroud)
当我对这两种方法进行基准测试时,第二种方法需要40倍的时间才能完成!
为什么第二种方法需要更长的时间?如何将工作改造为速度效率和使用函数式编程风格?
我一直在使用maven一段时间,我经常在选择我想要使用的版本之前查看存储库.我不完全理解扩展意味着什么.
我知道,当我看到像-RC1和-RC2这样的扩展时,意味着释放候选者.当我看到没有扩展名的版本时,我认为这意味着发布的版本.但-M1或-M2的扩展名是什么意思?
例:
2.8 RC1
2.8
2.8-M1 ??
这是我可以在java中做的事情,获取重复参数的结果并将其传递给另一个方法:
public void foo(String ... args){bar(args);}
public void bar(String ... args){System.out.println("count="+args.length);}
Run Code Online (Sandbox Code Playgroud)
在scala中它看起来像这样:
def foo(args:String*) = bar(args)
def bar(args:String*) = println("count="+args.length)
Run Code Online (Sandbox Code Playgroud)
但这不会编译,bar签名需要一系列单独的字符串,而传入的args是一些非字符串结构.
现在我只是绕过阵列.使用星号参数会非常好.有办法吗?
我知道你可以将scala对象标记为@serializable
,但我不明白之后如何处理该对象.我只是将其视为Java Serializable对象吗?
我想将对象序列化为字节流.有人能告诉我将序列化对象转换为字节数组或字符串的代码吗?
(谷歌对这个问题没有帮助)
关注:谢谢.我现在明白我可以像Java Serializable
对象一样使用它.有时,明显的答案让我感到安慰.
我现在明白scala @serializable对象可以和Java Serializable对象一样使用.在Java Serializable对象中,您可以覆盖以更改对象流的方式:writeObject(ObjectOutputStream)/ readObject(ObjectOutputStream).
你可以覆盖或注入scala @serializable对象的方法,允许你改变对象的序列化方式吗?
在为部分函数创建String映射时,我遇到了意外行为.当我创建一个部分函数作为地图元素时,它工作正常.当我分配给val时,它会调用.尝试调用检查会生成错误.这是预期的吗?我在做一些蠢事吗?注释掉check()
以查看调用.我正在使用scala 2.7.7
def PartialFunctionProblem() = {
def dream()() = {
println("~Dream~");
new Exception().printStackTrace()
}
val map = scala.collection.mutable.HashMap[String,()=>Unit]()
map("dream") = dream() // partial function
map("dream")() // invokes as expected
val check = dream() // unexpected invocation
check() // error: check of type Unit does not take parameters
}
Run Code Online (Sandbox Code Playgroud) functional-programming scala function partial-application partialfunction
我想我可能会遗漏list-json xpath架构中的一些基本内容.我能够提取和遍历列表的最流畅的方式如下所示.有人可以告诉我一个更好的技术:
class Example {
@Test
def traverseJsonArray() {
def myOperation(kid:JObject) = println("kid="+kid)
val json = JsonParser.parse("""
{ "kids":[
{"name":"bob","age":3},
{"name":"angie","age":5},
]}
""")
val list = ( json \\ "kids" ).children(0).children
for ( kid <- list ) myOperation(kid.asInstanceOf[JObject])
}
}
Run Code Online (Sandbox Code Playgroud) 我正在构建一个返回多部分响应的Web服务.我知道构建多部分响应的格式; 如果我找不到现有的工具,我会建立自己的工具.
也许我只需要帮助我的google-foo.我发现的一切都是关于POST或消费多部分消息.没有关于产生多部分回复的信息.
我正在玩创建一个通用工厂,如下所示:
trait Factory[T] { def createInstance():T = new T() }
val dateFactory = new Factory[Date](){}
val myDate = dateFactory.createInstance()
Run Code Online (Sandbox Code Playgroud)
'new T()'不编译,因为T在运行时未定义.我知道我可以通过将类的实例传递给某个方法来实现它(即createInstance(classOf [Date]))
我问是否有一些内省魔法可以取代'新T()',以便我可以创建我的超级简单工厂?
Scala中是否有可以向Array对象添加方法的模式?
我在考虑将Int隐式转换为RichInt.但是这不可能,因为Array是最后一堂课.
有一段时间我一直在努力将scala与可能返回null的java方法集成.我想出了以下实用程序,它有很多帮助:
// produce an Option, nulls become None
object Maybe {
def apply[T](t:T) = if (t==null) None else Some(t)
}
Maybe(javaClass.getResultCouldBeNull()).map( result => doSomeWork(result) )
Run Code Online (Sandbox Code Playgroud)
我对这个解决方案有几个问题: