为什么要forEach以随机顺序打印数字,同时collect始终按原始顺序收集元素,即使是从并行流中收集?
Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8};
List<Integer> listOfIntegers = new ArrayList<>(Arrays.asList(intArray));
System.out.println("Parallel Stream: ");
listOfIntegers
.stream()
.parallel()
.forEach(e -> System.out.print(e + " "));
System.out.println();
// Collectors
List<Integer> l = listOfIntegers
.stream()
.parallel()
.collect(Collectors.toList());
System.out.println(l);
Run Code Online (Sandbox Code Playgroud)
输出:
Parallel Stream:
8 1 6 2 7 4 5 3
[1, 2, 3, 4, 5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud) 出于某种原因,我们使用com.sun.java.swing.plaf.windows.WindowsComboBoxUI在 Java 5.0 到 Java 8.0 的 Windows/Linux/Mac OS 平台上工作的类
从 Java 10 和 Java 11 开始(我们将坚持它作为 LTS)这个类对类加载器不可见:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/java/swing/plaf/windows/WindowsComboBoxUI
at xxx.YYY.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.sun.java.swing.plaf.windows.WindowsComboBoxUI
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more
Run Code Online (Sandbox Code Playgroud)
我们怎样才能让它工作?
有人可以解释的行为o2吗?是因为编译器优化吗?它是否记录在 JLS 的某处?
public class Test {
public static void main(String[] args) {
Object o1 = new Object() {
String getSomething() {
return "AAA";
}
};
// o1.getSomething(); // FAILS
String methods1 = Arrays.toString(o1.getClass().getMethods());
var o2 = new Object() {
String getSomething() {
return "AAA";
}
};
o2.getSomething(); // OK
String methods2 = Arrays.toString(o2.getClass().getMethods());
System.out.println(methods1.equals(methods2));
}
}
Run Code Online (Sandbox Code Playgroud)
产生的输出是
真的
[更新]
经过一些富有成效和有用的讨论,我想我可以理解这种行为(如果我的假设有误,请发表评论)。
首先,感谢@user207421,他解释说 Java 编译器将类型o2视为与 RHS 相同的类型,其中:
Object getSomething方法然后感谢@Joachim Sauer …
我有一个命令行Java应用程序,它在Windows 7 x64平台上读写文件.目前,应用程序与IBM Java SE 6一起运行.结构如下:
APP_ROOT
some_folder
jre
bin
lib
myjarfile.jar
appl_start.bat
Run Code Online (Sandbox Code Playgroud)
现在,我用解压缩的JRE 8包替换了jre文件夹.并且应用程序开始抱怨它无法在some_folder中"访问"(实际上是它的写操作)文件.如果我在APP_ROOT下手动创建新的some_folder_1并重新配置应用程序以使用它 - 应用程序运行正常.如果我删除新创建的some_folder_1并将some_folder重命名为some_folder_1 - 应用程序抱怨它无法访问它(即使在读取模式下).
如果我用JRE 6文件替换jre文件夹 - 应用程序开始工作正常.
尝试通过属性比较有效权限 - 所有看起来都一样,没有什么可疑的.UAC已打开,我正在工作并在常规用户下更换文件夹.
更新:我在Windows 7中关闭UAC并重新启动后,应用程序开始与JRE 8一起正常工作.但是我需要让它与UAC打开一起工作.将UAC恢复为打开并重新启动时 - 使用JRE 8的应用程序再次失败.此外,注意到似乎JRE 8无法在"C:\ Users\username\AppData\Local\VirtualStore\Program Files(x86)\"中创建正确的文件,它通常在程序尝试在Program Files中编写时创建.
更新2:做了更多的故障排除,并缩小了问题:
所以,我得出结论 - 由于某种原因,JRE 8无法将输出写入C:\ Program Files ...重定向到C:\ Users ...\VirtualStore
如何解决这个问题,所以JRE 8开始在JRE …
我注意到Java为root用户和非root用户提出了不同的外观和感觉类.我试图了解如何使LAF保持一致.而且,即使在用户/ root中也不一致:取决于用户/ root登录的方式:
示例代码(已编译和打包laf.jar):
import javax.swing.UIManager;
public class laf {
public static void main(java.lang.String[] args) {
try {
System.out.print(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
方案1以普通用户身份登录到计算机(在GUI模式下)
样本输出(以用户身份)
[xxx@yyy Downloads]$ java -classpath laf.jar laf
com.sun.java.swing.plaf.gtk.GTKLookAndFeel
Run Code Online (Sandbox Code Playgroud)
样本输出(切换到root via su)
[root@yyy Downloads]# java -classpath ./laf.jar laf
javax.swing.plaf.metal.MetalLookAndFeel
Run Code Online (Sandbox Code Playgroud)
方案2以root身份登录到计算机(在GUI模式下)
示例输出(以root身份)
[root@yyy Downloads]# java -classpath ./laf.jar laf
com.sun.java.swing.plaf.gtk.GTKLookAndFeel
Run Code Online (Sandbox Code Playgroud)
场景3作为普通用户通过SSH登录到计算机(类似于上面的场景#1,但在这种情况下 - 相同的LAF)
样本输出(以用户身份)
[xxx@yyy Downloads]$ java -classpath laf.jar laf
javax.swing.plaf.metal.MetalLookAndFeel
Run Code Online (Sandbox Code Playgroud)
示例输出(切换到 …
这种样式可以吗,还是每行都必须从第 1 行开始?它不会影响执行,而只会影响可读性。
IF NOT EXIST "%AAA%" (
FOR %%f IN (*.*) DO (
ECHO Copying %%f
COPY %%f "%AAA%" > NUL
)
)
Run Code Online (Sandbox Code Playgroud) 我读过 JPMS 的优点之一是更好的封装(除非明确打开,否则所有内容都受到限制)。
但我有一个问题:是什么阻止了程序员替换module-info.class第三方模块 JAR 并导出所有包,甚至制作open模块,因此所有内容都可以通过反射(包括private成员)访问。
JPMS 是否真的可以帮助隐藏内部代码,或者就像 Java 8 及更早版本一样:所有内容都可以通过反射 API 访问,甚至是private成员(从 Java 9 开始只需要额外的步骤来打开模块)?
java ×6
java-10 ×2
java-8 ×2
windows ×2
batch-file ×1
java-11 ×1
java-9 ×1
java-module ×1
java-platform-module-system ×1
java-stream ×1
jls ×1
linux ×1
redhat ×1
swing ×1
var ×1