小编Bar*_*jeu的帖子

为什么并行流在Java 8中按顺序收集

为什么要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)

java parallel-processing java-8 java-stream

33
推荐指数
2
解决办法
8971
查看次数

如何处理 Java 11 中缺少的 Swing PLAF 类?

出于某种原因,我们使用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)

我们怎样才能让它工作?

java swing look-and-feel java-10 java-11

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

为什么 Object 和 var 变量的行为不同?

有人可以解释的行为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 var type-inference java-10

7
推荐指数
2
解决办法
155
查看次数

Java SE 6和Java SE 8 JRE在Windows 7上的行为不同(文件权限)

我有一个命令行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:做了更多的故障排除,并缩小了问题:

  1. 只有在写入"C:\ Program Files\APP_ROOT\some_folder"时,JRE 8的应用程序才会失败
  2. 通过Windows 7设计在这种情况下,文件有望在C:\ User ..\VirtualStore中创建,但是JRE 8无法做到这一点(这是错误的和问题的根源)
  3. JRE 6可以在VirtualStore中创建良好的文件.
  4. 在使用JRE 8重新运行之前,已清理VirtualStore内容
  5. 使用"some_folder_1"和JRE 8组合成功运行是因为JRE 8实际上写在C:\ Program Files/APP_ROOT/some_folder_1内 - 这是违反恕我直言.所以,这是另一个问题 - 为什么JRE 8没有将写入重定向到VirtualStore中的文件系统,而是修改了C:\ Program Files子文件夹.
  6. 如果我将%localusrdir%定义到某个C:\ temp目录,则JRE 8显示同样的问题,因此它不仅仅是VirtualStore文件夹的特定问题,恕我直言.

所以,我得出结论 - 由于某种原因,JRE 8无法将输出写入C:\ Program Files ...重定向到C:\ Users ...\VirtualStore

如何解决这个问题,所以JRE 8开始在JRE …

java windows file-permissions windows-7-x64 java-8

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

Linux中的Java - root和non-root的不同外观类

我注意到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)

示例输出(切换到 …

java linux redhat look-and-feel

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

为什么从Java模块中打开一个不存在的包?

JLS 11 “ 7.7.2。导出和打开的包”说:

允许opens指定一个与当前模块关联的编译单元未声明的包。

这将是什么情况?为什么需要这个?

java jls java-module

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

在 Windows 批处理文件中可以使用缩进吗?

这种样式可以吗,还是每行都必须从第 1 行开始?它不会影响执行,而只会影响可读性。

IF NOT EXIST "%AAA%" (
    FOR %%f IN (*.*) DO (
        ECHO Copying %%f
        COPY %%f "%AAA%" > NUL
    )
)
Run Code Online (Sandbox Code Playgroud)

windows batch-file

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

Java 平台模块系统 - 保护的重点是什么?

我读过 JPMS 的优点之一是更好的封装(除非明确打开,否则所有内容都受到限制)。

但我有一个问题:是什么阻止了程序员替换module-info.class第三方模块 JAR 并导出所有包,甚至制作open模块,因此所有内容都可以通过反射(包括private成员)访问。

JPMS 是否真的可以帮助隐藏内部代码,或者就像 Java 8 及更早版本一样:所有内容都可以通过反射 API 访问,甚至是private成员(从 Java 9 开始只需要额外的步骤来打开模块)?

java-platform-module-system java-9

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