带有"""分隔符的 Java 13 多行文本块工具正变得众所周知。
但是,我经常需要整段没有嵌入换行符的段落。
换句话说,以下代码片段:
String paragraph =
"""
aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii
"""
System.out.println(paragraph);
Run Code Online (Sandbox Code Playgroud)
如您所料,产生以下内容:
aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii
Run Code Online (Sandbox Code Playgroud)
...这通常非常有用。但是,就我而言,对于特别大的段落,我需要它来生成:
aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii
Run Code Online (Sandbox Code Playgroud)
(....稍后处理文本流。)
有没有办法为三重引号功能建立“无换行符”参数?
我正在使用 Java 14 启动一个新的 Spring 5 项目。它已编译,但给了我一个警告:
OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决它?
Java 13引入了yield用于switch表达式的关键字。
我该如何使用它?它与默认值return或break值有什么区别?
我目前正在使用 Maven 在 Java 8 JDK 上使用 SonarQube Community Edition 7.7 版,我想开始评估 OpenJDK 13 。Sonarqube 不支持 OpenJDK 13
从Java 11开始,可以启用Java编译器和运行时上的PREVIEW-MODE。它允许预览新功能。(JEP 12)
java --enable-preview
Run Code Online (Sandbox Code Playgroud)
如何在Java中检测是否已在启用预览模式的情况下启动JVM?
目的是在应用程序内状态页面/ json上描述正在运行的容器-用于devops概述。
到目前为止,我研究了系统属性和标志,它们均未包含任何提示。
我正在创建一个 spring-boot 应用程序,它在 openJdk12 上运行并表现良好。应用:https : //github.com/jactor-rises/jactor-persistence
我正在寻找如何使用 openJdk13 进行设置。
我尝试使用 spring-boot2.1.8.RELEASE和2.1.9.RELEASE,但两个版本都在运行时失败,并显示IllegalStateException:
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)
at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:97)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeTestInstancePostProcessors$5(ClassTestDescriptor.java:349)
at org.junit.jupiter.engine.descriptor.JupiterTestDescriptor.executeAndMaskThrowable(JupiterTestDescriptor.java:215)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeTestInstancePostProcessors$6(ClassTestDescriptor.java:349)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1621)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312)
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeTestInstancePostProcessors(ClassTestDescriptor.java:348)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.instantiateAndPostProcessTestInstance(ClassTestDescriptor.java:270)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$testInstanceProvider$2(ClassTestDescriptor.java:259)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$testInstanceProvider$3(ClassTestDescriptor.java:263)
at java.base/java.util.Optional.orElseGet(Optional.java:362)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$testInstanceProvider$4(ClassTestDescriptor.java:262)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:82)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:59)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$0(NodeTestTask.java:83)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) …Run Code Online (Sandbox Code Playgroud) 我在Java 12中使用开关表达式¹将字符串转换为HTTP方法:
static Optional<RequestMethod> parseRequestMethod(String methodStr) {
return Optional.ofNullable(
switch (methodStr.strip().toUpperCase(Locale.ROOT)) {
case "GET" -> RequestMethod.GET;
case "PUT" -> RequestMethod.PUT;
case "POST" -> RequestMethod.POST;
case "HEAD" -> RequestMethod.HEAD;
default -> {
log.warn("Unsupported request method: '{}'", methodStr);
return null;
}
});
}
Run Code Online (Sandbox Code Playgroud)
我想警告默认分支中不支持的方法,并返回null(然后包装在Optional中)。
但是上面的代码会导致编译器错误:
返回封闭开关表达式之外
我该如何进行编译?
为了完整起见,这是RequestMethod枚举的定义:
enum RequestMethod {GET, PUT, POST, HEAD}
Run Code Online (Sandbox Code Playgroud)
¹ 开关表达式是Java 12中的预览功能。
阅读 JAVA 13 SE 规范,我在第 5 章第 5.1.7 节中找到。拳击转换以下保证:
如果被装箱的值 p 是对 boolean、char、short、int 或 long 类型的常量表达式(第 15.28 节)求值的结果,并且结果为 true、false,则为 '\u0000' 到 ' 范围内的字符\u007f'(含),或 -128 到 127(含)范围内的整数,然后让 a 和 b 是 p 的任意两次装箱转换的结果。a == b 总是这样
我觉得奇怪的是,字节类型的值被排除在该措辞之外。
例如,在如下代码中:
Byte b1=(byte)4;
Byte b2=(byte)4;
System.out.println(b1==b2);
Run Code Online (Sandbox Code Playgroud)
我们有一个byte类型的常量表达式,装箱后b1和b2的值可能是也可能不是同一个对象。
在没有演员的情况下,它实际上以相同的方式工作:
Byte b1=4;
Run Code Online (Sandbox Code Playgroud)
在这里,我们在赋值上下文中有一个 int 类型的常量表达式。所以,根据规范
如果变量的类型为 Byte、Short 或 Character,并且常量表达式的值可分别以 byte、short 或 char 类型表示,则可以使用缩窄原语转换后跟装箱转换。
因此表达式将被转换为字节,并且该字节类型的值将被装箱,因此不能保证该值是实习的。
我的问题是我对规范的解释是否正确,还是我遗漏了什么?我查看了规范是否需要使用 Byte.valueOf() 方法进行装箱(为此可以保证),但事实并非如此。
更新
在整个评论中,结果证明我采用的基准测试方法是不正确的,因此结果具有误导性。在纠正我的方法后(如接受的答案),结果正如人们所期望的 - JDK 13 的性能与 JDK 11 一样好。有关更多详细信息,请参阅答案。
原始问题
我在 Windows 10 下对 HashSet 进行了一些性能基准测试,使用以下 JMH 测试代码:
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@Fork(value = 1, warmups = 1)
public void init() {
HashSet<String> s = new HashSet<>();
for (int i = 0; i < 1000000; i++) {
s.add(Math.random() + "");
}
s.size();
}
Run Code Online (Sandbox Code Playgroud)
我在不同的 JDK 版本下编译并运行它,这是我得到的结果:
我也用不同的堆大小对其进行了测试(因此每个 JDK 有 3 种不同的颜色)。JDK 14 当然是今天的预发布快照——只是为了看看 ZGC 在 Windows 下的表现。
我想知道 - JDK 11 之后发生了什么?(注意,对于 JDK 12,它已经开始增长,即使它没有出现在上面的图表中)
这是我的 pom.xml:
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>13</source>
<target>13</target>
<release>13</release>
<compilerArgs>
--enable-preview
</compilerArgs>
</configuration>
</plugin>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<reuseForks>false</reuseForks>
<argLine>--enable-preview</argLine>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
问题是构建正常,但是当启动测试时我得到:
[错误] 无法在项目 foo-project 上执行目标 org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M4:test (default-test):执行目标 org.apache.maven 的默认测试.plugins:maven-surefire-plugin:3.0.0-M4:测试失败:java.lang.UnsupportedClassVersionError:未为其/project/MyTest启用预览功能(类文件版本57.65535)。尝试使用 '--enable-preview' 运行 -> [帮助 1]
我必须在 pom.xml 中插入什么才能在启用预览模式的情况下执行测试?
谢谢。