前段时间我发现了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) 我正在编写一个宏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>怎么办呢?
在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)
如何正确检索我的狗的名字?
我的Java库应该与Java 8和Java 9兼容.对于使用Java 9运行,我们需要一些Java 9模块.
我知道我可以通过命令行添加它--add-modules.但它是一个库,我无法控制命令行.
是否有一个等价--add-modules的MANIFEST.MF?或者还有其他与Java 8兼容的解决方案吗?
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编译器是否对非尾递归调用进行优化?
Java 9有一个Java的read-eval-print循环,叫做jshell.我从命令行看到它的基本模式.它还能用于远程过程吗?换句话说,我可以连接到另一个Java进程并输入代码片段以在该运行时内运行吗?这将是改变应用程序服务器配置状态,而无需编写与UI的管理工具的好方法.
我有以下程序:
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.
我有两个这样的列表实例:
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.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.miscBASE64Encoder和类CharacterEncoder但现在,我收到一个编译错误,说The package sun.misc conflicts with a package accessible from another module: jdk.unsupported.
有什么办法可以解决这个错误吗?如果没有,我可以添加一个jar包含这些类的依赖项吗?我只是想确保这些类在运行时可用于第三方库(通过我自己的源代码或通过捆绑这些类的 jar)。
事实证明,几乎没有人正确地关闭Java中的资源.程序员要么不使用try-finally块可言,或只是把resource.close()在finally,这也是不正确的(因为Throwable从close()可影子Throwable从try块).有时他们把类似的东西IOUtils.closeQuietly()只是正确的InputStream,但不是OutputStream.try-with-resources解决了所有这些问题,但仍有大量的项目用Java 6编写.
try-with-resources在Java 6中模拟的最佳方法是什么?现在我使用的是Guava Closer,它比什么都好,但仍然比它更糟糕try-with-resources.此外,还有一种称为贷款模式的模式,但Java中缺少lambdas使得这种模式非常麻烦.有没有更好的办法?
java ×7
java-9 ×3
ghc ×2
haskell ×2
java-8 ×2
java-platform-module-system ×2
scala ×2
async-await ×1
asynchronous ×1
base64 ×1
deprecated ×1
forkjoinpool ×1
java-11 ×1
java-module ×1
java-stream ×1
javac ×1
jshell ×1
macros ×1