小编Zhe*_*lov的帖子

Scala异步与Java ForkJoinTask

前段时间我发现了Scala异步项目.问题是:这个async块中有什么神奇的东西不能通过普通函数实现(没有宏扩展)?

让我们看一下介绍中的第一个例子:

import ExecutionContext.Implicits.global
import scala.async.Async.{async, await}

val future = async {
    val f1 = async { ...; true }
    val f2 = async { ...; 42 }
    if (await(f1)) await(f2) else 0
}
Run Code Online (Sandbox Code Playgroud)

我在上面的例子中看不到任何不能用纯Java编写的东西.这段代码完全相同:

import java.util.concurrent.*;
import java.util.function.Supplier;

// First define a helper method for creating async blocks:
public static <T> ForkJoinTask<T> async(Supplier<T> supplier) {
    return new RecursiveTask<T>() {
        @Override
        protected T compute() {
            return supplier.get();
        }
    }.fork();
}

ForkJoinTask<Integer> future = ForkJoinPool.commonPool().submit(() -> { …
Run Code Online (Sandbox Code Playgroud)

java asynchronous scala async-await forkjoinpool

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

如何区分宏中的三引号和单引号?

我正在编写一个宏m(expr: String),其中expr是某种语言的表达式(不是Scala):

m("SOME EXPRESSION")

m("""
  SOME EXPRESSION
""")
Run Code Online (Sandbox Code Playgroud)

当我解析表达式时,我想在源文件中报告具有适当位置的错误消息.为了实现这一点,我应该知道字符串文字本身的位置和文字(3或1)的引号数.不幸的是,我没有找到任何返回文字引号数的方法:

import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context

object Temp {
  def m(s: String) : String = macro mImpl

  def mImpl(context: Context)(s: context.Expr[String]): context.universe.Tree = {
    import context.universe._

    s match {
      case l @ Literal(Constant(p: String)) =>
        if (l.<TRIPLE QUOTES>) {
          ...
        } else {
          ...
        }

      case _ =>
        context.abort(context.enclosingPosition, "The argument of m must be a string literal")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我该<TRIPLE QUOTES>怎么办呢?

macros scala

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

如何消除选择器功能的歧义?

在GHC 8中:

{-# LANGUAGE DuplicateRecordFields #-}

data Dog = Dog { name::String }
data Human = Human { name::String }

dog = Dog "Spike"


main = putStrLn $ name dog
Run Code Online (Sandbox Code Playgroud)

此代码无法编译:

Ambiguous occurrence `name'
It could refer to either the field `name', defined at A.hs:4:22
                      or the field `name', defined at A.hs:3:18
Run Code Online (Sandbox Code Playgroud)

如何正确检索我的狗的名字?

haskell ghc

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

我可以通过MANIFEST.MF要求Java 9模块吗?

我的Java库应该与Java 8和Java 9兼容.对于使用Java 9运行,我们需要一些Java 9模块.

我知道我可以通过命令行添加它--add-modules.但它是一个库,我无法控制命令行.

是否有一个等价--add-modulesMANIFEST.MF?或者还有其他与Java 8兼容的解决方案吗?

java java-platform-module-system java-9 java-module

11
推荐指数
2
解决办法
3193
查看次数

为什么年份=年+ 1因堆栈溢出而失败?

year.hs:

year = year + 1

main = print year
Run Code Online (Sandbox Code Playgroud)

这不是尾递归调用:

year = year + 1
year = (year + 1) + 1
year = ((year + 1) + 1) + 1
...
Run Code Online (Sandbox Code Playgroud)

但是runhaskell year.hs不输出任何东西,这表明它会遇到无限循环.

Haskell编译器是否对非尾递归调用进行优化?

haskell tail-recursion ghc

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

可以使用Java 9 jshell在另一个JVM中运行代码吗?

Java 9有一个Java的read-eval-print循环,叫做jshell.我从命令行看到它的基本模式.它还能用于远程过程吗?换句话说,我可以连接到另一个Java进程并输入代码片段以在该运行时内运行吗?这将是改变应用程序服务器配置状态,而无需编写与UI的管理工具的好方法.

java java-9 jshell

10
推荐指数
2
解决办法
736
查看次数

--release不允许从系统模块导出包

我有以下程序:

module-info.java

module a {
}
Run Code Online (Sandbox Code Playgroud)

Main.java

public class Main {
    public static void main(String[] args) {
        System.out.println(sun.nio.ByteBuffered.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序成功编译--add-exports选项:

> javac --add-exports java.base/sun.nio=a module-info.java Main.java
Run Code Online (Sandbox Code Playgroud)

但是,当我添加--release参数时,它会失败:

> javac --add-exports java.base/sun.nio=a --release 9 module-info.java Main.java
error: exporting a package from system module java.base is not allowed with --release
1 error
Run Code Online (Sandbox Code Playgroud)

基本上,这两个命令是等效的.那么为什么后者被禁止呢?

此外,由于IDEA将--release参数传递给javac,如果我的项目需要内部API,这使得IDEA的开发变得不可能.

我正在使用JDK 9 + 178.

java javac java-platform-module-system java-9

10
推荐指数
4
解决办法
2803
查看次数

使用Java 8 Streams基于常见条件从两个不同的列表创建映射

我有两个这样的列表实例:

List<NameAndAge> nameAndAgeList = new ArrayList<>();
nameAndAgeList.add(new NameAndAge("John", "28"));
nameAndAgeList.add(new NameAndAge("Paul", "30"));
nameAndAgeList.add(new NameAndAge("Adam", "31"));

List<NameAndSalary> nameAndSalaryList = new ArrayList<>();
nameAndSalaryList.add(new NameAndSalary("John", 1000));
nameAndSalaryList.add(new NameAndSalary("Paul", 1100));
nameAndSalaryList.add(new NameAndSalary("Adam", 1200));
Run Code Online (Sandbox Code Playgroud)

这里NameAndAge

class NameAndAge {
    public String name;
    public String age;

    public NameAndAge(String name, String age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + ": " + age;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且NameAndSalary

private class NameAndSalary {
    private String name;
    private double …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

10
推荐指数
2
解决办法
309
查看次数

Java 11:补丁 sun.misc.BASE64Encoder

这个问题不是java.lang.NoClassDefFoundError: sun/misc/BASE64Encoder的重复。

我正在尝试更新我的应用程序中的 Java 版本(到 11),并且我的应用程序中的一个库使用sun.misc.BASE64Encoder类,所以我不可避免地会遇到此异常:

Caused by: java.lang.ClassNotFoundException: sun.misc.BASE64Encoder
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
Run Code Online (Sandbox Code Playgroud)

现在,解决的方法是使用java.util.Base64apache commons,正如其他答案所建议的那样。然而,问题是,这个库属于第三方,我没有它的源代码。似乎没有一个新版本不使用这些类。因此,为了解决这个问题,我执行了以下操作:

  • 已创建包sun.misc
  • 复制此包中的BASE64Encoder和类CharacterEncoder

但现在,我收到一个编译错误,说The package sun.misc conflicts with a package accessible from another module: jdk.unsupported.

有什么办法可以解决这个错误吗?如果没有,我可以添加一个jar包含这些类的依赖项吗?我只是想确保这些类在运行时可用于第三方库(通过我自己的源代码或通过捆绑这些类的 jar)。

java base64 deprecated java-8 java-11

10
推荐指数
2
解决办法
3万
查看次数

在Java 6中模拟try-with-resources的最佳方法是什么?

事实证明,几乎没有人正确地关闭Java中的资源.程序员要么不使用try-finally块可言,或只是把resource.close()finally,这也是不正确的(因为Throwableclose()可影子Throwable从try块).有时他们把类似的东西IOUtils.closeQuietly()只是正确的InputStream,但不是OutputStream.try-with-resources解决了所有这些问题,但仍有大量的项目用Java 6编写.

try-with-resources在Java 6中模拟的最佳方法是什么?现在我使用的是Guava Closer,它比什么都好,但仍然比它更糟糕try-with-resources.此外,还有一种称为贷款模式的模式,但Java中缺少lambdas使得这种模式非常麻烦.有没有更好的办法?

java try-with-resources

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