我有一个Seq类的对象,如下所示:
class A (val key: Int, ...)
Run Code Online (Sandbox Code Playgroud)
现在我想将此转换Seq为a Map,使用key每个对象的值作为键,并将对象本身作为值.所以:
val seq: Seq[A] = ...
val map: Map[Int, A] = ... // How to convert seq to map?
Run Code Online (Sandbox Code Playgroud)
如何在Scala 2.8中高效且优雅地完成这项工作?
定义Java接口时,可以使用类型参数声明方法,例如:
public interface ExampleInterface {
<E extends Enum<E>> Class<E> options();
}
Run Code Online (Sandbox Code Playgroud)
同样的事情在注释中不起作用.例如,这是非法的:
public @interface ExampleAnnotation {
<E extends Enum<E>> Class<E> options();
}
Run Code Online (Sandbox Code Playgroud)
我可以通过使用原始类型得到我想要的东西Enum:
public @interface ExampleAnnotation {
@SuppressWarnings("rawtypes")
Class<? extends Enum> options();
}
Run Code Online (Sandbox Code Playgroud)
究竟是什么原因导致无法使用类型参数声明注释属性?
当我for在Scala中评估一个时,我得到一个不可变的IndexedSeq(一个具有类似数组的性能特征的集合,例如高效的随机访问):
scala> val s = for (i <- 0 to 9) yield math.random + i
s: scala.collection.immutable.IndexedSeq[Double] = Vector(0.6127056766832756, 1.7137598183155291, ...
Run Code Online (Sandbox Code Playgroud)
是for一个yield总是返回一个IndexedSeq,还是它还可以返回一些其他类型的集合类(LinearSeq例如,a)?如果它还可以返回其他内容,那么什么决定了返回类型,我该如何影响它呢?
我正在使用Scala 2.8.0.RC3.
假设我在头文件中声明了两个模板函数:
template <typename T> void func1(const T& value);
template <typename T> void func2(const T& value);
Run Code Online (Sandbox Code Playgroud)
并且假设这些函数的实现(也在头文件而不是源文件中,因为它们是模板)使用一些实现辅助函数,它也是一个模板:
template <typename T> void helper(const T& value) {
// ...
}
template <typename T> void func1(const T& value) {
// ...
helper(value);
}
template <typename T> void func2(const T& value) {
// ...
helper(value);
}
Run Code Online (Sandbox Code Playgroud)
在我包含头文件的任何源文件中,辅助函数都是可见的.我不希望这样,因为辅助函数只是一个实现细节.有没有办法隐藏辅助功能?
Scala编译器通常可以推断方法的返回类型,但在某些情况下需要指定返回类型.例如,递归方法需要指定返回类型.
我注意到有时我得到错误消息"重载方法(methodname)需要返回类型",但是一般规则是必须始终为重载方法指定返回类型(我有一些例子,我没有得到这个错误).
何时需要指定返回类型,对于一般的方法,特别是对于重载方法?
我有一个我想要随机排列的数组.在Java中,有一个方法Collections.shuffle()可以随机地重新排列List的元素.它也可以在数组上使用:
String[] array = new String[]{"a", "b", "c"};
// Shuffle the array; works because the list returned by Arrays.asList() is backed by the array
Collections.shuffle(Arrays.asList(array));
Run Code Online (Sandbox Code Playgroud)
我尝试在Scala数组上使用它,但Scala解释器回答了一个冗长的答案:
scala> val a = Array("a", "b", "c")
a: Array[java.lang.String] = Array(a, b, c)
scala> java.util.Collections.shuffle(java.util.Arrays.asList(a))
<console>:6: warning: I'm seeing an array passed into a Java vararg.
I assume that the elements of this array should be passed as individual arguments to the vararg.
Therefore I follow the array with a `: _*', to mark …Run Code Online (Sandbox Code Playgroud) 是否有相当于Java 的Reactive Extensions(.NET)?
关于Rx(Reactive Extensions)
Rx是一个使用可观察集合组成异步和基于事件的程序的库.
我知道规则引擎,比如来自JBOSS的Drools,但还有其他一些更接近Microsoft .NET方法的方法吗?
Scala有一个号码,你可以为类型类使用,如性状Ordered,并Numeric在包装中scala.math.
例如,我可以使用Ordered如下方法编写泛型方法:
def f[T <% Ordered[T]](a: T, b: T) = if (a < b) a else b
Run Code Online (Sandbox Code Playgroud)
我想做类似的事情Numeric,但这不起作用:
def g[T <% Numeric[T]](a: T, b: T) = a * b
Run Code Online (Sandbox Code Playgroud)
为什么Ordered和之间存在明显的差异Numeric?
我知道还有其他方法可以做到这一点,以下方法将起作用(使用上下文绑定):
def g[T : Numeric](a: T, b: T) = implicitly[Numeric[T]].times(a, b)
Run Code Online (Sandbox Code Playgroud)
但这看起来比仅仅能够*乘以两个数字更复杂.为什么Numeric特征不包括类似的方法*,而Ordered包括类似的方法<?
我知道Ordering你也可以用同样的方式使用Numeric,另见这个答案:
def f[A : Ordering](a: A, b: A) …Run Code Online (Sandbox Code Playgroud) 看看这个Scala类:
class Example {
val (x, y): (Int, Int) = (1, 2)
}
Run Code Online (Sandbox Code Playgroud)
编译这会导致警告:
Example.scala:2: warning: non variable type-argument Int in type pattern
(Int, Int) is unchecked since it is eliminated by erasure
val (x, y): (Int, Int) = (1, 2)
^
Run Code Online (Sandbox Code Playgroud)
删除显式类型注释会消除此警告:
class Example {
val (x, y) = (1, 2)
}
Run Code Online (Sandbox Code Playgroud)
为什么我会收到警告,为什么删除显式类型注释会删除它?据我所知,没有任何真正的变化,x并且y仍然是Int没有类型注释的类型.
我试图了解在方法中使用System.out.println()vs的好处和好处return blah.
它似乎System.out.println()用于显示静态信息,并且return是从该方法返回的值.然而,我正在看下面的例子,其中一个函数在System.out.println()语句中使用
System.out.println(name.substring(1, 3));
Run Code Online (Sandbox Code Playgroud)
什么时候使用System.out.println()和return.是否return可以在以后使用另一段代码,而System.out.println()不能?
scala ×6
java ×3
scala-2.8 ×3
.net ×1
annotations ×1
arrays ×1
c++ ×1
collections ×1
generics ×1
linq ×1
methods ×1
overloading ×1
return ×1
return-value ×1
shuffle ×1
system.out ×1
templates ×1
type-erasure ×1
typeclass ×1