2

我已经找到Eclipse Collections非常有用。尤其是原始类型的集合(例如:IntObjectHashMap)。不幸的是,在 IntelliJ IDEA 调试器中呈现这些集合存在问题。

让我们有一个示例代码:

import org.eclipse.collections.impl.map.mutable.primitive.IntObjectHashMap;
import java.util.HashMap;

public class Test {
    public static void main(String[] args) {
        IntObjectHashMap<String> eclipseMap = new IntObjectHashMap<>(4);
        eclipseMap.put(1, "one");
        eclipseMap.put(2, "two");

        HashMap<Integer, String> hashMap = new HashMap<>(4);
        hashMap.put(1, "one");
        hashMap.put(2, "two");

        System.out.println("" + eclipseMap);
        System.out.println("" + hashMap);
    }
}

这里我们有一个调试器变量视图:

在此处输入图像描述

我们可以看到 JDK HashMap 被完美渲染,但是IntObjectHashMapEclipse Collection 却不是。

当我下拉 Eclipse Collection 的值时,情况更糟:

在此处输入图像描述

正如我们所看到的 - 没有one元素。

您可以说:好的,作为一种解决方法,您可以使用toStringIntelliJ 中提供的标准渲染器:

在此处输入图像描述

不幸的是,我的情况并非如此,因为我的收藏有数千万个元素。

所以我的问题是:

有人知道一个地方/一个项目,我可以在其中找到用于原始类型的 Eclipse Collections 的 IntelliJ Java 类型渲染器吗?

4

2 回答 2

3

您可以创建一个类型渲染器,例如: 在此处输入图像描述

于 2021-02-03T09:45:01.977 回答
2

@Egor 的答案几乎是完美的 :) 效果很好,但仅适用于小型收藏。

让我描述@Egor 解决方案的问题。让我们看一下这个例子:

import org.eclipse.collections.impl.map.mutable.primitive.IntObjectHashMap;

public class Test3 {
    public static void main(String[] args) {
        final int CAPACITY = 20_000_000;
        IntObjectHashMap<String> eclipseMap = new IntObjectHashMap<>();
        for (int i = 0; i < CAPACITY; i++) {
            eclipseMap.put(i, Integer.toString(i));
        }

        System.out.println("Hello world.");
    }
}

现在运行它 - 一切正常。现在将断点放在行System.out.println("Hello world.")并在调试模式下执行该程序。

我们将被 OutOfMemoryError 打耳光(因为 IntelliJ 在此集合上调用了 toString 方法):

在此处输入图像描述

为了解决这个问题,我们需要设置When rendering a node-> Use following expression- 例如这样:

在此处输入图像描述

于 2021-02-05T14:26:45.407 回答