小编Geo*_*org的帖子

为什么我需要jsr305才能在scala中使用guava?

我有以下scala文件:

object SGuavaTryout {
  com.google.common.cache.CacheBuilder.newBuilder()
}
Run Code Online (Sandbox Code Playgroud)

我在类路径中使用guava-11.0.2.jar进行编译.我的scala 2.9.1编译器(eclipse插件和普通scalac)抱怨:

error while loading CacheBuilder, Missing dependency 
  'class javax.annotation.CheckReturnValue', required by 
  D:\devel\eclipse-workspace\Scala Spielwiese\guava-11.0.2.jar
  (com/google/common/cache/CacheBuilder.class)
Run Code Online (Sandbox Code Playgroud)

要编译,我需要将jsr305(jsr305-1.3.9.jar)添加到构建路径.没有jsr305的java等价编译就好了:

public class JGuavaTryout {
  public void tryout() {
    com.google.common.cache.CacheBuilder.newBuilder();
  }
}
Run Code Online (Sandbox Code Playgroud)

scala需要jsr305的任何想法?是否有官方的jsr305实现与番石榴一起使用?

谢谢! - 乔治

scala guava

19
推荐指数
3
解决办法
5877
查看次数

1 MB或更大的Java字节数组占用RAM的两倍

在Windows 10 / OpenJDK 11.0.4_x64上运行下面的代码会作为输出used: 197和输出expected usage: 200。这意味着200个字节数组(一百万个元素)占用了大约。200MB RAM。一切都很好。

当我将代码中的字节数组分配从new byte[1000000]更改为new byte[1048576](即更改为1024 * 1024个元素)时,它会作为输出used: 417和产生expected usage: 200。有没有搞错?

import java.io.IOException;
import java.util.ArrayList;

public class Mem {
    private static Runtime rt = Runtime.getRuntime();
    private static long free() { return rt.maxMemory() - rt.totalMemory() + rt.freeMemory(); }
    public static void main(String[] args) throws InterruptedException, IOException {
        int blocks = 200;
        long initiallyFree = free();
        System.out.println("initially free: " + initiallyFree / 1000000);
        ArrayList<byte[]> …
Run Code Online (Sandbox Code Playgroud)

java memory arrays memory-leaks

14
推荐指数
1
解决办法
319
查看次数

为什么我在scala比赛中有一个不可能的案例?

在下面的例子中,在第二个中case我会期望与第一个相同的编译错误case,但它编译.为什么?

object CaseMatching extends App {

  case class Id(value: Long)
  object Id { val zero = Id(0) }
  case class Name(value: String)
  case class IdName(id: Id, name: Name)

  IdName(Id(0), Name("A")) match {
    case IdName(_, Id(0)  ) => // does not compile (as expected)
    case IdName(_, Id.zero) => // does compile (but should not ?)
    case IdName(Id.zero, _) => println("OK") // this is OK and will match
    case _ =>
  }

}
Run Code Online (Sandbox Code Playgroud)

为什么相关?- 我花了大部分时间来找出为什么从未遇到过以下情况:case TreeEntry(_, Some(child), …

scala pattern-matching case-class

5
推荐指数
1
解决办法
547
查看次数

为什么 Scala Option.tapEach 返回 Iterable,而不是 Option?

scaladocOption.tapEach状态“的回报:因为这同样的逻辑集合”正如预期的名字命名的操作tapforeach。但是,它不返回 anOption而是Iterable由 a 支持List

scala> import scala.util.chaining._

scala> Option(5).tap(_.foreach(_ => ()))
val res0: Option[Int] = Some(5)

scala> Option(5).tapEach(_ => ())
val res1: Iterable[Int] = List(5)
Run Code Online (Sandbox Code Playgroud)

(已针对 Scala 2.13.5 和 3.0.0-RC1 进行验证)

是否有充分的理由返回Iterable而不是Option,或者这只是被忽略了(最终可能会被修复)?

scala scala-collections

4
推荐指数
1
解决办法
130
查看次数

大字节数组使用的堆比预期多

我使用 1 GB Java 堆 ( -Xmx1g) 将数据存储在许多大型字节数组中。我花了OutOfMemoryError相当长的时间存储 1 GB 的数据。此时,根据 Runtime 计算,还有相当多的空闲堆rt.maxMemory() - rt.totalMemory() + rt.freeMemory()

字节数组大小 约。可存储的数据 约。显示空闲堆
2^18 (262144) 800MB 270MB
2^17 (131072) 930MB 140MB
2^16 (65536) 997MB 72MB
2^15 (32768) 1032MB 36MB

为什么大字节数组的堆大小计算关闭,我可以做些什么来修复它吗?


注意:当使用 2^19(或更大)大小的字节数组时,会发生不同的情况:1 MB 或更多的 Java 字节数组占用两倍的 RAM - 让我们将这个问题集中在 2^18 大小的字节数组上。

java -cp .\lib\* -Xmx1g tryit.Main在 Windows和 Debian上使用 64 位服务器 VM AdoptOpenJDK 11.0.11 运行java -cp .:./lib/* -Xmx1g tryit.Main

package tryit;

public class …
Run Code Online (Sandbox Code Playgroud)

java memory arrays out-of-memory

2
推荐指数
1
解决办法
1145
查看次数

Scala - 推断为错误类型,导致类型不匹配?

在Scala 2.11.5中,编译它

object Tryout {
  trait A {
    def method(a: Int): Boolean
  }

  abstract class B extends A {
    def method(a: Int) = ???
  }

  new B {
    override def method(a: Int) = true  // type mismatch here
  }
}
Run Code Online (Sandbox Code Playgroud)

在"真实"处产生"类型不匹配:找到布尔值,需要无效".如果我???用true或false 替换它,它会编译.如果我在抽象类中指定"方法"的结果类型,它也会编译.

这不是一个大问题.但是我很好奇是否有人可以解释为什么???没有正确推断为布尔值?

inheritance types scala

1
推荐指数
1
解决办法
790
查看次数

为什么 Option.fold 不能在 Scala 中尾递归使用?

下面,sumAllIf是尾递归,sumAllFold不是。但是,sumAllIf实际上具有相同的实现。这是 Scala 编译器(或 Scala 库)的缺点,还是我忽略了某些东西?

def maybeNext(in: Int): Option[Int] = if in < 10 then Some(in + 1) else None

// The Scala library implements Option.fold like this:
// @inline final def fold[B](ifEmpty: => B)(f: A => B): B =
//   if (isEmpty) ifEmpty else f(this.get)
@annotation.tailrec
def sumAllIf(current: Int, until: Int, sum: Int): Int =
  val nextOption = maybeNext(current)
  if (nextOption.isEmpty) sum else sumAllIf(nextOption.get, until, sum + nextOption.get)

// However, with Scala 3.1.0 …
Run Code Online (Sandbox Code Playgroud)

scala tail-recursion fold

1
推荐指数
1
解决办法
172
查看次数