我是scala的新手,现在我必须处理一个用scala和java编写的项目.我遇到了类似这样的结构:
class SomeType{
//...
}
trait Trait1 extends scala.AnyRef{
}
trait Trait2 extends extends scala.AnyRef{
}
class MyClass(arg : SomeType) extends Trait1{
//...
}
object MyClass extends Trait2{
//...
}
Run Code Online (Sandbox Code Playgroud)
这有点麻木.据我所知,通过阅读这个答案,我们可以将object
s视为仅使用抽象方法的类.即我们可以(在我看来)Class<T>
在java中定义一些与对象的映射.
但在这个例子中class
并object
扩展了不同的 trait
s.这就是我真正感到困惑的地方.我无法想象这意味着什么以及为什么使用它.
我testng 6.11
在以下测试类中使用和编写测试:
public class MyTest{
public int i;
public void init(){
//initialize i
}
@Test
public void test1(){
//test some
}
@Test
public void test2(){
//Here I need fresh value of i as it would be
//right after invocation of init()
//...
//test something else
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以init()
在调用测试类中的每个测试之前使 testng run方法?
我是Scala的新手并尝试使用以下继承:
abstract class Command(arg: Any)
case object Help extends Command // <---- Ok
Run Code Online (Sandbox Code Playgroud)
但如果我用这个代替它:
abstract class Command(arg: Option[Any])
case object Help extends Command // <---- Fail
Run Code Online (Sandbox Code Playgroud)
为什么?为什么它在第一个例子中工作?
我是Scala的新手,想要scala.io.Source
上课.但我发现它与Char
s一起运行,但不是Byte
s.我很困惑的是,Char
s是编码/平台相关的.我的意思是我们可以编码UTF-8
或"windows-1251"中编码的字符.
windows-1251
是严格的1字节编码...有没有办法使用原始字节操作?
我有一个非循环链表数据结构.像这样:
public class LinkLst<T>{
private Node<T> first;
public LinkLst(T t){
first = new Node(t);
}
}
public class Node<T>{
private T t;
private Node<T> next;
public Node(T t){
this.t = t;
}
public void setNext(Node<T> n){
this.next = next;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我们默认知道List没有循环.有没有办法从结尾处找到第n个元素LinkLst<T> lst
,只有一次迭代if n <= size(lst)
和throw IndexOutOfBoundException
if n > size(lst)
.
public <T> T fromTheEnd(LinkLst<T> lst, int n){
//...?
}
Run Code Online (Sandbox Code Playgroud)
我唯一能找到的是反转它然后找到所需的元素,但它需要2次迭代.一个用于反向,一个用于找到所需的元素.还有内存开销.
我是FS2的新手,需要有关设计的一些帮助。我正在尝试设计一个流,该流将从底层提取块InputStream
直到结束。这是我尝试过的:
import java.io.{File, FileInputStream, InputStream}
import cats.effect.IO
import cats.effect.IO._
object Fs2 {
def main(args: Array[String]): Unit = {
val is = new FileInputStream(new File("/tmp/my-file.mf"))
val stream = fs2.Stream.eval(read(is))
stream.compile.drain.unsafeRunSync()
}
def read(is: InputStream): IO[Array[Byte]] = IO {
val buf = new Array[Byte](4096)
is.read(buf)
println(new String(buf))
buf
}
}
Run Code Online (Sandbox Code Playgroud)
程序将打印第一个块。这是合理的。但是我想找到一种方法来“发出信号”在哪里停止阅读以及在哪里停止。我的意思是继续打电话read(is)
直到结束。有办法实现吗?
我也尝试过,repeatEval(read(is))
但它会一直读下去……我之间需要一些东西。
我正在设计以下特征和方法:
trait Reader[T]{
def read(): T
}
def rd[T, A](r: Reader[T])(implicit ev: T =:= Option[A]): Either[String, A] = r.read() match {
case Some(a) => Right(a) // <---- compile error here
case None => Left("End reached")
}
Run Code Online (Sandbox Code Playgroud)
问题是我在上面的代码中遇到了编译错误:
Error:(17, 27) type mismatch;
found : a.type (with underlying type Any)
required: A
case Some(a) => Right(a)
Run Code Online (Sandbox Code Playgroud)
但是当我明确地添加类型时,它会编译一个警告:
trait Reader[T]{
def read(): T
}
def rd[T, A](r: Reader[T])(implicit ev: T =:= Option[A]): Either[String, A] = r.read() match {
case Some(a: A) => Right(a) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试理解并编写以下代码:
object Main extends App {
val resultOption: Option[Int] =
for{
i1 <- opt1
i2 <- opt2
} yield {
if(i1 + i2 > 10) null.asInstanceOf[Int]
else i1 + i2
}
println(resultOption) // <---- Here
def opt1: Option[Int] = //some computations
def opt2: Option[Int] = //some computations
}
Run Code Online (Sandbox Code Playgroud)
我希望resultOption
要None
的情况下满足条件,但Some(0)
返回.我查看了yield块的编译代码,我们在这里得到的是:
Code:
0: aload_0
1: getfield #25 // Field i1$1:I
4: iload_1
5: iadd
6: bipush 10
8: if_icmple 18
11: aconst_null
12: invokestatic #31 …
Run Code Online (Sandbox Code Playgroud) 我有一个非常大val s: List[Int] = //...
,一个功能f: Int => Boolean
和一个功能transform: Int => Int
.
问题:我想创造另一个List[Int]
,使得所有元素e: Int
的的s: List[Int]
,这样f(e) = true
与更换transform(e)
.
我看了一下cats-mtl FunctorEmpty
(坚持函数编程风格),但它似乎不适用于我的情况.也许某些cats
/ scalaz
数据结构在这里有用吗?还是其他任何方式?
我写了以下简单的代码:
import cats.effect.IO
import cats.instances.either._
import cats.syntax.TraverseSyntax
object Test extends App with TraverseSyntax{
val e: Either[String, IO[Int]] = Right(IO(2))
e.sequence //error here
}
Run Code Online (Sandbox Code Playgroud)
不幸的是它拒绝编译
Error:(25, 94) value sequence is not a member of scala.util.Either
Run Code Online (Sandbox Code Playgroud)
你能解释一下原因吗?我导入了either
包含的实例Traverse[Either[A, ?]]
.怎么了?
scala ×8
java ×3
scala-cats ×3
case ×1
either ×1
fs2 ×1
inheritance ×1
io ×1
linked-list ×1
list ×1
scala-option ×1
scalaz ×1
testing ×1
testng ×1
types ×1