与Stack Overflow相关的问题Scala相当于新的HashSet(Collection),如何将Java集合(java.util.List
比如说)转换为Scala集合List
?
我其实想转换一个Java API调用Spring的 SimpleJdbcTemplate
,它返回一个java.util.List<T>
,成一个斯卡拉不变HashSet
.例如:
val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l
Run Code Online (Sandbox Code Playgroud)
这似乎有效.批评是受欢迎的!
import scala.collection.immutable.Set
import scala.collection.jcl.Buffer
val s: scala.collection.Set[String] =
Set(Buffer(javaApi.query( ... ) ) : _ *)
Run Code Online (Sandbox Code Playgroud) 我最近放弃了尝试在Eclipse中使用Scala(像完成这样的基本内容不起作用).所以现在我正在尝试使用IntelliJ.我没有走得太远.
我已经能够编辑程序了(在语法高亮和完成之内......耶!).但我甚至无法运行最简单的"Hello World".这是原始错误:
Scala signature Predef has wrong version Expected 5.0 found: 4.1 in .... scala-library.jar
但那是昨天的IDEA 9.0.1.见下文...
UPDATE
今天我卸载了IntelliJ 9.0.1,并安装了9.0.2 Early Availability,以及4/14稳定版的Scala插件.
然后我从头开始通过向导设置一个项目:
创建了一个新类:
object hello { def main(args: Array[String]) { println("hello: " + args); } }
对于我的努力,我现在有一个全新的错误:)
这里是:
Scalac内部错误:类java.lang.ClassNotFoundException [java.net.URLClassLoader $ 1.run(URLClassLoader.java:202),java.security.AccessController.doPrivileged(Native Method),java.net.URLClassLoader.findClass(URLClassLoader.java) :190),java.lang.ClassLoader.loadClass(ClassLoader.java:307),sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301),java.lang.ClassLoader.loadClass(ClassLoader.java:248) ,java.lang.Class.forName0(本机方法),java.lang.Class.forName(Class.java:169),org.jetbrains.plugins.scala.compiler.rt.ScalacRunner.main(ScalacRunner.java:72) ]
最终更新
我卸载了9.0.2 EA并重新安装了9.0.1,但这次使用的是2.7.3版本的Scala而不是默认的2.7.6,因为2.7.3是IntelliJ网站屏幕截图中显示的那个(我猜屏幕截图证明他们实际测试了这个版本!).现在一切正常!!!
我正在尝试创建一个特性,当混入时,将用一个调用原始方法的方法替换方法的默认定义,然后操纵结果.
这是我正在尝试做的事情:
class Foo {
def bar() : String = "Foos bar"
}
trait OtherStuff {
self : Foo =>
def bar() : String = self.bar() + " with OtherStuff"
}
class Quux extends Foo with OtherStuff
Run Code Online (Sandbox Code Playgroud)
如果按照我想要的方式工作,那么(new Quux).bar
现在就会回归Foos bar with OtherStuff
.不幸的是,它不起作用 - 我得到的是:
<console>:6: error: error overriding method bar in class Foo of type ()String;
method bar in trait OtherStuff of type ()String needs `override' modifier
class Quux extends Foo with OtherStuff
Run Code Online (Sandbox Code Playgroud)
但如果我override
在定义时使用 …
我可以"屈服"成地图吗?
我试过了
val rndTrans = for (s1 <- 0 to nStates;
s2 <- 0 to nStates
if rnd.nextDouble() < trans_probability)
yield (s1 -> s2);
Run Code Online (Sandbox Code Playgroud)
(而,
不是->
)但我得到了错误
TestCaseGenerator.scala:42: error: type mismatch;
found : Seq.Projection[(Int, Int)]
required: Map[State,State]
new LTS(rndTrans, rndLabeling)
Run Code Online (Sandbox Code Playgroud)
我明白为什么,但我看不出如何解决这个问题: - /
我试图在WPF/silverlight数据绑定中使用数据绑定看到一种更清晰的替代方案(对于Scala来说是惯用的) - 即实现INotifyPropertyChanged.首先,一些背景:
在.Net WPF或silverlight应用程序中,您具有双向数据绑定的概念(即,将UI的某些元素的值绑定到DataContext的.net属性,以便更改为UI元素影响属性,反之亦然.实现这一点的一种方法是在DataContext中实现INotifyPropertyChanged接口.不幸的是,这为你添加到"ModelView"类型的任何属性引入了很多样板代码.这是它的外观在斯卡拉:
trait IDrawable extends INotifyPropertyChanged
{
protected var drawOrder : Int = 0
def DrawOrder : Int = drawOrder
def DrawOrder_=(value : Int) {
if(drawOrder != value) {
drawOrder = value
OnPropertyChanged("DrawOrder")
}
}
protected var visible : Boolean = true
def Visible : Boolean = visible
def Visible_=(value: Boolean) = {
if(visible != value) {
visible = value
OnPropertyChanged("Visible")
}
}
def Mutate() : Unit = {
if(Visible) {
DrawOrder += 1 // Should trigger …
Run Code Online (Sandbox Code Playgroud) 我从2.x和IDE开始使用Eclipse已经超过20年了(自80年代后期的Turbo Pascal和Turbo C以来!).
(该序言应该暗示,"我不是白痴"......但听起来并不那么聪明...... LOL: - ])
现在我正在尝试在IntelliJ 9.0.1中使用Scala调试器.我已经辞去了旧的待机状态,"hello world"技巧来检查环境是否设置正确:
class hello { def main(a: Array[String]) = println("got args: " + a) }
我也试过这个版本,以防万一:
object hello extends Application { println("hi") }
唉,我甚至无法让这个简单的Scala示例运行.我想最终在其中设置一个断点,但是现在只运行它会很棒.我有Java 1.6u20和Scala插件0.3.473(2010年1月).以下错误总结了我的经验:
替代文字http://img535.imageshack.us/img535/842/ij9.jpg
我可能做错了什么?
谢谢
我有以下简单的Java代码:
package testj;
import java.util.*;
public class Query<T> {
private static List<Object> l = Arrays.<Object>asList(1, "Hello", 3.0);
private final Class<? extends T> clazz;
public static Query<Object> newQuery() { return new Query<Object>(Object.class); }
public Query(Class<? extends T> clazz) { this.clazz = clazz; }
public <S extends T> Query<S> refine(Class<? extends S> clazz) {
return new Query<S>(clazz);
}
public List<T> run() {
List<T> r = new LinkedList<T>();
for (Object o : l) {
if (clazz.isInstance(o)) r.add(clazz.cast(o));
}
return r;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以用Java调用它,如下所示: …
我的scala版本2.7.7
我试图从更大的字符串中提取电子邮件地址.字符串本身不遵循任何格式.我得到的代码:
import scala.util.matching.Regex
import scala.util.matching._
val Reg = """\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
"yo my name is joe : joe@gmail.com" match {
case Reg(e) => println("match: " + e)
case _ => println("fail")
}
Run Code Online (Sandbox Code Playgroud)
正则表达式在RegExBuilder中传递但不传递scala.另外,如果有另一种方法来做这个没有正则表达式也可以.谢谢!