Java: print_r?

В последний раз я спросил, как заполнить структуру данных здесь. Теперь я хотел бы узнать, есть ли что-то в Java, например print_r, который я использую в PHP, чтобы представить то, что я заполнил в Карты и списки без необходимости выполнять собственный алгоритм.

Любые идеи?

Ответы

Ответ 1

Вызов toString в коллекции должен возвращать строку, содержащую все представления строк элементов.

Это не будет работать со встроенными массивами, так как у них нет переопределения toString и он просто укажет вам адрес памяти.

Ответ 2

Вы можете попробовать старый добрый Apache Commons Lang ToStringBuilder.

Ответ 3

В зависимости от того, что вы хотите сделать, решение может быть довольно простым. Ниже не будет выводиться форматированный вывод, который предоставляет 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());

Для других типов объектов вы можете использовать reflection для создания utility для этой цели.

Ответ 4

Существует действительно разница между toString() в java и print_r() в PHP. Обратите внимание, что в php также есть __toString(), что эквивалентно toString() в java, поэтому на самом деле это не ответ.

print_r используется, когда у нас есть структура объектов, и нам нравится быстро видеть полный график объектов с их значениями.

Реализация toString в java для каждого объекта не может сравниться с print_r.

Вместо этого используйте gson. Он выполняет ту же работу, что и print_r

Gson gson = new GsonBuilder(). setPrettyPrinting(). create();
 System.out.println(gson.toJson(SomeObject));

Таким образом вам не нужно реализовывать toString для каждого объекта, который вам нужен, чтобы протестировать его.

Вот документация: http://sites.google.com/site/gson/gson-user-guide

Демо-классы (в java):

открытый класс A {

int firstParameter = 0;
B secondObject = new B();

}

открытый класс B {

String myName = "this is my name";  

}

Вот результат в php с print_r:

Объект
(
    [firstParameter: private] = > 0
    [secondObject: private] = > Объект B
        (
            [myName: private] = > это мое имя
        )

)

Вот результат в java с gson:

{
   "firstParameter": 0,
   "secondObject": {
     "myName": "это мое имя"
  }
}

Ответ 5

Другие упомянули метод toString(). Это действительно полезно, когда объект реализует toString(). Если он не был выполнен правильно, вы получите что-то вроде этого: [email protected].

Даже если это немного утомительно, все же легко реализовать toString() в ваших собственных классах, но сторонние классы не всегда будут реализовывать его. Вам гораздо лучше использовать отладчик. Единственная причина, по которой такие вещи, как print_r, даже существуют в PHP, - это отсутствие реального отладчика. Я думаю, вы обнаружите, что возможность устанавливать точки останова вместо использования набора диагностических операторов печати приведет к значительно более быстрому документообороту и более чистому коду.

Ответ 6

Мой выбор для Java print_r как функция, это класс RecursiveDump, который я написал. Это не идеально, но он работает хорошо для меня. Использование:

String output = RecursiveDump.dump(...);

Его можно было бы улучшить с помощью дженериков, я написал это много лет назад, прежде чем я узнал о них. Кроме того, в то время как он пытается разобраться с некоторыми типами коллекций, с объектами он просто вызывает метод toString().

Я думал использовать Reflection для извлечения имен полей для классов без правильного toString(), но поскольку Spring Roo @RooToString может написать метод toString() для вас...

Конечно, альтернативой является использование инспекторского инструмента отладчика, но иногда быстрее использовать отпечатки.

Ответ 7

Я не знаю об эквиваленте print_r в java.

Но...

Каждый объект имеет стандартную реализацию метода toString(), реализация списка и карты выводит их содержимое, если вы вызываете toString() для них.

Если вам нужна распечатка отладочной информации, то toString() может быть местом, которое вы ищете.

Ответ 8

В Java нет эквивалента для print_r.

Но для карт или списков вы можете использовать foreach-loop следующим образом:

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

// print each list element 

for (String s : list) {

   System.out.println(s);

 }

Ответ 9

Для массивов самым простым способом является Arrays.asList(array).toString(). Обычно я использую toString() для объектов, которые мне нравятся в отладочных выводах. Для сгенерированных объектов (JAXB и т.д.), Хотя может потребоваться сделать класс утилиты для его печати. ​​