你怎么scala.None能从Java 访问?
最后一行导致编译器死于"类型scala.None不接受参数".
import scala.Option;
import scala.Some;
import scala.None;
final Option<String> object1 = new Some<String>("Hi there");
final Option<String> object2 = new None<String>();
Run Code Online (Sandbox Code Playgroud)
这失败了"无法找到符号构造函数None()":
final Option<String> object2 = new None();
Run Code Online (Sandbox Code Playgroud)
这失败了"无法找到符号变量无":
final Option<String> object2 = None;
Run Code Online (Sandbox Code Playgroud)
在2007年,这曾经工作,但随后Scala改变了.Java编译器给出error: incompatible types:
final Option<String> object2 = scala.None$.MODULE$;
Run Code Online (Sandbox Code Playgroud) 在阅读了一些OpenJDK邮件列表条目后,似乎Oracle开发人员目前正在进一步从关闭提案中删除内容,因为早期的Java语言设计错误使Java闭包的引入变得复杂.
考虑到Scala闭包比Java 8计划的闭包更强大,我想知道是否可以调用Java方法从Scala中获取闭包,在Java中定义闭包并将其赋予Scala函数等?
那么Java闭包会像字节码中的Scala对应物一样表示还是不同?是否有可能缩小Java/Scala闭包之间的功能差距?
假设我正在使用Scala项目中的Java库.Java库在所有地方都抛出了异常,但我觉得让它们"在Scala世界中"传播感觉不舒服,因为无法确定Scala方法可以抛出什么异常(除非记录它们).所以这是我倾向于编写的代码:
def doesNotThrowExceptions(parameter: String): Either[Throwable, T] =
catching(classOf[IOException], classOf[NoSuchAlgorithmException]) either {
// Code calling the Java library
// Code generating a value of type T
}
Run Code Online (Sandbox Code Playgroud)
然后,通常,我将使用Either.RightProjection.flatMap链接返回Either[Throwable, ...]或Either.RightProjection.map混合返回Either[Throwable, ...]方法和其他方法的方法.或者只是Either.fold对Throwable价值做点什么.但不知怎的,这仍然感觉不完全正确.
这是处理Scala中Java异常的最"惯用"方式吗?有没有更好的方法?
我需要在Java中实现一个返回"Seq"的方法但是我遇到错误,我不知道如何解决它.
java.util.ArrayList cannot be cast to scala.collection.Seq
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的代码
@Override
public Seq<String> columnNames() {
List<String> a = new ArrayList<String>();
a.add("john");
a.add("mary");
Seq<String> b = (scala.collection.Seq<String>) a;
return b;
}
Run Code Online (Sandbox Code Playgroud)
Seq似乎没有提供转换为的可能性scala.collection.JavaConverters.谢谢
我正在尝试将一些Scala代码注入到我现有的Java应用程序中.(所以说,我想要更多的乐趣).
我在Scala中创建了一个单例东西
ScalaPower.scala
package org.fun
class ScalaPower
object ScalaPower{
def showMyPower(time:Int) = {
(0 to time-1).mkString(", ")
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在OldJava.java中
class OldJava {
public void demo(){
System.out.println(?)
}
}
Run Code Online (Sandbox Code Playgroud)
我应该填写什么?以便Java将调用showMyPower方法?我都尝试 org.fun.ScalaPower.showMyPower(10)和org.fun.ScalaPower.getInstance().showMyPower(10)但没有工作.
(使用Jad反编译类文件只显示无意义的代码.)
编辑
我删除class ScalaPower声明和scala按预期生成静态方法.(打电话给org.fun.ScalaPower.showMyPower(10)工作).
不知道它是否是scala编译器中的错误
我正在使用库(JXPath)来查询bean的图形以便提取匹配的元素.但是,JXPath返回匹配元素组作为java.lang.Iterator的实例,我更愿意将其转换为不可变的scala列表.有没有比在迭代器上迭代并在每个迭代步骤创建一个新的不可变列表更简单的方法?
我是Scala的新手.到目前为止,我只能编写基本代码,但我想更具体地开始使用它,而不仅仅是学习理论.
假设我在HelloWorld.java中有以下Java代码:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World");
}
}
Run Code Online (Sandbox Code Playgroud)
等效的Scala代码是什么?
有很多关于从Scala代码调用Java varargs的文章,但我唯一能找到相反的方法就是这个问题:在java中使用scala vararg方法,它没有任何具体的例子.
我试图使用scala.Console一些Java代码,因为它java.io.Console在Eclipse中不起作用,而Scala则起作用.但我无法得到这种方法
def readLine (text: String, args: Any*): String
Run Code Online (Sandbox Code Playgroud)
工作,因为它似乎期待scala.collection.Seq[Any]第二个参数,我不知道如何Seq在Java中创建 .我该如何解决这个问题?
我试过的事情:
1)使用null
// Java
String s = scala.Console.readLine("Enter text: ", null);
Run Code Online (Sandbox Code Playgroud)
- 获得奖励NullPointerException.
2)替换nullwith scala.collection.Seq.empty(),但javac会报告各种错误,例如Seq没有empty方法.
3)Nil在scala.collection.immutable包对象中使用对象,但是这里建议的语法是scala.collection.immutable.package$Nil$.MODULE$,但是无法解决.
当然我可以使用readLine()不采用varargs 的方法,但这太容易了.
作为将Java代码转换为Scala代码的努力的一部分,我需要将Java流转换Files.walk(Paths.get(ROOT))为Scala.我无法通过谷歌搜索找到解决方案.asScala不会这样做.任何提示?
以下是相关代码:
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Collectors;
....
Files.walk(Paths.get(ROOT))
.filter(path -> !path.equals(Paths.get(ROOT)))
.map(path -> Paths.get(ROOT).relativize(path))
.map(path -> linkTo(methodOn(FileUploadController.class).getFile(path.toString())).withRel(path.toString()))
.collect(Collectors.toList()))
Run Code Online (Sandbox Code Playgroud)
Files.walk(Paths.get(ROOT))返回类型是Java中的Stream.
我有一个用Scala编写的应用程序,我的一些团队成员想要它的Java版本.它是一个演示应用程序,使用另一个用Scala编写的API,他们希望Java版本的应用程序能够使用Java中的API.但是,应用程序有点大,我不想手动重新使用Java(他们不想学习Scala).是否有任何工具可以从Scala代码自动生成(可读)Java代码?