Java:print_r?

时间:2020-03-06 14:52:10  来源:igfitidea点击:

上次我问如何在此处填充数据结构。现在,我想知道在Java中是否有某些东西,例如我在PHP中使用的print_r,可以表示我在Maps和列表中填充的内容,而无需执行自己的算法。

有任何想法吗?

解决方案

在集合上调用toString应该返回一个字符串,其中包含所有元素的字符串表示形式。

但是,这不适用于内置数组,因为它们没有toString覆盖,只会为我们提供一个内存地址。

我不知道java中的print_r等效项。

但...

每个对象都有toString()方法的默认实现,如果我们为它们调用toString(),则列表和地图实现会打印其内容。

如果我们需要打印出任何调试信息,则toString()可能是我们要找的地方。

我们可以尝试使用旧的Apache Commons Lang的ToStringBuilder。

在Java中没有print_r的等效项。

但是对于地图或者列表,我们可以使用如下所示的foreach循环:

List <String> list = …; // fills your list 

// print each list element 

for (String s : list) {

   System.out.println(s);

 }

对于数组,最简单的方法是Arrays.asList(array).toString()。
我通常在调试输出中希望在对象上实现的对象上实现toString()。对于生成的对象(JAXB等),尽管可能需要制作一个实用程序类以进行打印。

其他人提到了toString()方法。这仅在对象实现toString()时才有用。如果未正确实施,则会得到类似以下内容的内容:java.lang.Object @ 1b9240e

即使有点乏味,在我们自己的类中实现toString()仍然很容易,但是第三方类并不总是实现它。使用调试器会更好。像print_r这样的东西在PHP中甚至存在的唯一原因是因为缺少真正的调试器。我认为我们会发现,能够设置断点而不使用一堆诊断打印语句将导致工作流程更快,代码更简洁。

根据我们要执行的操作,解决方案可能非常简单。以下代码不会产生print_r提供的格式化输出,但是它将允许我们输出列表,数组和映射的结构:

// Output a list
    final List<String> list = new ArrayList<String>();
    list.add("one");
    list.add("two");
    list.add("three");
    list.add("four");
    System.out.println(list);

    // Output an array
    final String[] array = {"four", "three", "two", "one"};
    System.out.println(Arrays.asList(array));

    // Output a map
    final Map<String, String> map = new HashMap<String, String>();
    map.put("one", "value");
    map.put("two", "value");
    map.put("three", "value");
    System.out.println(map.entrySet());

对于其他类型的对象,我们可以使用反射来创建用于此目的的实用程序。