Возможно ли распечатать определенные значения переменных экземпляра объектов, помещенных в список массивов? Геттеры? [Дубликат]

Многие ответы хороши, но я использую это как в быстрых 4

  1. Создать константу
    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
    
  2. Использовать как это
    if App.isRunningOnIpad {
        return load(from: .main, identifier: identifier)
    } else {
        return load(from: .ipad, identifier: identifier)
    }
    

Изменить: поскольку предлагаемый Cœur просто создает расширение на UIDevice

extension UIDevice {
static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false

}

167
задан wattostudios 16 April 2012 в 03:54
поделиться

19 ответов

Ниже приведен пример получения распечатки компонента списка:

public class ListExample {

    public static void main(String[] args) {
        List<Model> models = new ArrayList<>();

        // TODO: First create your model and add to models ArrayList, to prevent NullPointerException for trying this example

        // Print the name from the list....
        for(Model model : models) {
            System.out.println(model.getName());
        }

        // Or like this...
        for(int i = 0; i < models.size(); i++) {
            System.out.println(models.get(i).getName());
        }
    }
}

class Model {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
83
ответ дан Crazenezz 20 August 2018 в 21:49
поделиться
  • 1
    Как введение класса Model связано с вопросом? – Karl Richter 16 November 2017 в 18:42
  • 2
    Это просто предположение, поскольку я не знаю, какой объект внутри списка. – Crazenezz 17 November 2017 в 10:43

Используя функции java 8.

import java.util.Arrays;
import java.util.List;

/**
 * @author AJMAL SHA
 *
 */
public class ForEach {

    public static void main(String[] args) {

        List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
        (features).forEach(System.out::println);

    }

}
8
ответ дан Ajmal sha 20 August 2018 в 21:49
поделиться
  • 1
    Есть ли конкретная причина для включения ссылки на объект features в скобки ()? – Diablo 22 February 2018 в 12:06
  • 2
    Нет, вы также можете сделать это, features.forEach (System.out :: println); – Ajmal sha 22 February 2018 в 12:35
  • 3
    features.forEach(System.out::println); так мы это делаем. () - здесь лишние и бессмысленные! – Diablo 22 February 2018 в 13:49
public static void main(String[] args) {
        answer(10,60);

    }
    public static void answer(int m,int k){
        AtomicInteger n = new AtomicInteger(m);
        Stream<Integer> stream = Stream.generate(() -> n.incrementAndGet()).limit(k);
        System.out.println(Arrays.toString(stream.toArray()));
    }
-1
ответ дан Alexander Mladzhov 20 August 2018 в 21:49
поделиться

Подход к потокам Java 8 ...

list.stream().forEach(System.out::println);
17
ответ дан Bradley D 20 August 2018 в 21:49
поделиться
  • 1
    тот же ответ, что и у Кати Хана – Karl Richter 16 November 2017 в 18:32
  • 2
    Нет, это не так. Мина использует поток (). – Bradley D 6 December 2017 в 18:43
  • 3
    @BradleyD, какие выгоды реализуются путем добавления другого уровня вызовов методов там? – Leon 8 December 2017 в 16:00

Так как Java 8, List наследует метод «forEach» по умолчанию, который вы можете комбинировать с ссылкой метода «System.out :: println» следующим образом:

list.forEach(System.out::println);
72
ответ дан Community 20 August 2018 в 21:49
поделиться
  • 1
    Это также напечатает указатель ... – Yassin Hajaj 8 March 2016 в 15:06
  • 2
    @ Katja Hahn, можно ли добавить или добавить некоторую строку в вывод println? – gumkins 25 September 2016 в 13:56
  • 3
    @gumkins, ДА, вы можете. Пример: Arrays.stream (новая строка [] {"John", "Sansa", "Cersei"}). Map (s - & gt; "Hi" + s + "!"). (System.out :: Println); – Tiago Mussi 11 June 2018 в 13:58
    list.stream().map(x -> x.getName()).forEach(System.out::println);
1
ответ дан Ella 20 August 2018 в 21:49
поделиться
  • 1
    Какой тип имеет x и как он связан с вопросом OP? – Karl Richter 16 November 2017 в 18:34

Для списка массива String

list.forEach(s -> System.out.println(Arrays.toString((String[]) s )));
0
ответ дан FelixSFD 20 August 2018 в 21:49
поделиться

Рассмотрим List<String> stringList, который может быть напечатан многими способами с использованием конструкций Java 8:

stringList.forEach(System.out::println);                            // 1) Iterable.forEach
stringList.stream().forEach(System.out::println);                   // 2) Stream.forEach (order maintained generally but doc does not guarantee)
stringList.stream().forEachOrdered(System.out::println);            // 3) Stream.forEachOrdered (order maintained always)
stringList.parallelStream().forEach(System.out::println);           // 4) Parallel version of Stream.forEach (order not maintained)
stringList.parallelStream().forEachOrdered(System.out::println);    // 5) Parallel version ofStream.forEachOrdered (order maintained always)

Как эти подходы отличаются друг от друга?

Первый подход (Iterable.forEach). Итератор коллекции обычно используется и предназначен для fail-fast , что означает, что он выкинет ConcurrentModificationException, если базовая коллекция будет структурно изменена во время итерации. Как упоминалось в doc для ArrayList:

Структурная модификация - это любая операция, которая добавляет или удаляет один или несколько элементов или явно изменяет размер массива поддержки;

Таким образом, это означает, что для параметра ArrayList.forEach значение допустимо без каких-либо проблем. И в случае одновременного сбора, например. ConcurrentLinkedQueue итератор будет слабо согласованным , что означает, что действия, переданные в forEach, допускают внесение даже структурных изменений без исключения ConcurrentModificationException. Но здесь модификации могут быть или не быть видимыми в этой итерации.

Второй подход (Stream.forEach) - порядок не определен. Хотя это может не произойти для последовательных потоков, но спецификация не гарантирует этого. Кроме того, действие должно быть неинтерферирующим в природе. Как упоминалось в doc :

Поведение этой операции явно недетерминировано. Для параллельных поточных конвейеров эта операция не гарантирует уважения порядка столкновений потока, так как это принесет жертву преимущества параллелизма.

Третий подход (Stream.forEachOrdered) - действие будет выполняться в порядке обнаружения потока. Поэтому всякий раз, когда порядок имеет значение forEachOrdered, без второй мысли. Как упоминалось в doc :

Выполняет действие для каждого элемента этого потока в порядке выполнения потока, если поток имеет определенный порядок встреч.

Во время повторения по синхронизированной коллекции первый подход будет принимать блокировку коллекции один раз и будет удерживать ее во всех методах вызовов к действию, но в случае потоков они используют разделитель коллекции, который не блокировать и полагаться на уже установленные правила невмешательства. В случае, если сбор, поддерживающий поток, изменяется во время итерации, будет выведена ConcurrentModificationException или может возникнуть непоследовательный результат.

Четвертый подход (Параллельный Stream.forEach). Как уже упоминалось, нет гарантии уважать порядок встреч, как ожидалось, в случае параллельных потоков. Возможно, что действие выполняется в разных потоках для разных элементов, которые никогда не могут иметь место с forEachOrdered.

Пятый подход (Параллельный Stream.forEachOrdered) - forEachOrdered будет обрабатывать элементы в порядок, заданный источником, независимо от того, является ли поток последовательным или параллельным. Поэтому нет смысла использовать это с параллельными потоками.

6
ответ дан i_am_zero 20 August 2018 в 21:49
поделиться
System.out.println(list);//toString() is easy and good enough for debugging.

toString() из AbstractCollection будет достаточно простым и легким для этого. AbstractList является подклассом AbstractCollection, поэтому нет необходимости в цикле и нет toArray ().

Возвращает строковое представление этой коллекции. Строковое представление состоит из списка элементов коллекции в том порядке, в котором они возвращаются его итератором, заключенным в квадратные скобки («[]»). Смежные элементы разделяются символами «,» (запятая и пробел). Элементы преобразуются в строки, как и String.valueOf (Object).

Если вы используете какой-либо пользовательский объект в своем списке, скажем, Student, вам нужно переопределить его метод toString() (он всегда полезно переопределить этот метод), чтобы иметь значимый результат

См. приведенный ниже пример:

public class TestPrintElements {

    public static void main(String[] args) {

        //Element is String, Integer,or other primitive type
        List<String> sList = new ArrayList<String>();
        sList.add("string1");
        sList.add("string2");
        System.out.println(sList);

        //Element is custom type
        Student st1=new Student(15,"Tom");
        Student st2=new Student(16,"Kate");
        List<Student> stList=new ArrayList<Student>();
        stList.add(st1);
        stList.add(st2);
        System.out.println(stList);
   }
}


public  class Student{
    private int age;
    private String name;

    public Student(int age, String name){
        this.age=age;
        this.name=name;
    }

    @Override
    public String toString(){
        return "student "+name+", age:" +age;
    }
}

вывод:

[string1, string2]
[student Tom age:15, student Kate age:16]
23
ответ дан Jaskey 20 August 2018 в 21:49
поделиться
  • 1
    Любая причина, почему это не принятый ответ? – Andrea Bergonzo 14 May 2018 в 13:06
  • 2
    Потому что этот ответ не совсем корректен. Он использует полиморфизм, не осознавая этого. Вот фактическая иерархия наследования для list: List -> Collection -> Iterable -> Object. Класс, который наследует от AbstractCollection, является ArrayList. Поэтому в этом примере, когда toString() вызывается, он находит реализацию ArrayList, которая определена в AbstractCollection. Обратите внимание на иерархию наследования для ArrayList: ArrayList -> AbstractList -> AbstractCollection -> Collection -> Iterable -> Object – anon58192932 1 July 2018 в 16:44

System.out.println(list); работает для меня.

Вот полный пример:

import java.util.List;    
import java.util.ArrayList;

public class HelloWorld {
     public static void main(String[] args) {
        final List<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        System.out.println(list);
     }
}

Он напечатает [Hello, World].

1
ответ дан jfmg 20 August 2018 в 21:49
поделиться
  • 1
    Не отличается от других, более ранних ответов – Karl Richter 16 November 2017 в 18:34
  • 2
    Я привел полный пример импорта, класса и основного метода, который вы можете копировать и вставлять и показывать результат. Поэтому нет оснований для его голосования по моему мнению – jfmg 17 November 2017 в 13:20

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

Вот быстрый тест, чтобы увидеть различия:

public class Test {

    public class T1 {
        public Integer x;
    }

    public class T2 {
        public Integer x;

        @Override
        public String toString() {
            return x.toString();
        }
    }

    public void run() {
        T1 t1 = new T1();
        t1.x = 5;
        System.out.println(t1);

        T2 t2 = new T2();
        t2.x = 5;
        System.out.println(t2);

    }

    public static void main(String[] args) {        
        new Test().run();
    }
}

И когда это выполняется, результаты, напечатанные на экране, следующие:

t1 = Test$T1@19821f
t2 = 5

Поскольку T1 не переопределяет метод toString, его экземпляр t1 выводится как нечто, что не очень полезно. С другой стороны, T2 переопределяет toString, поэтому мы контролируем, что он печатает, когда он используется в I / O, и мы видим что-то немного лучше на экране.

13
ответ дан K Mehta 20 August 2018 в 21:49
поделиться
  1. Вы не указали, какие элементы содержатся в списке, если это примитивный тип данных , тогда вы можете распечатать элементы.
  2. Но если элементы являются объектами, тогда как Кшитидж Мехта упомянул, что вам нужно реализовать (переопределить) метод «toString» внутри этого объекта - если он еще не реализован - и пусть он возвращает что-то, что означает полное изнутри объекта, например:
    class Person {
        private String firstName;
        private String lastName;
    
        @Override
        public String toString() {
            return this.firstName + " " + this.lastName;
        }
    }
    
5
ответ дан Karl Richter 20 August 2018 в 21:49
поделиться

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

Сбрасывает данный объект в System.out, используя следующие правила:

  • Если объект Iterable, все его компоненты сбрасываются.
  • Если Объект или один из его суперклассов переопределяет toString (), «toString» сбрасывается
  • . Else метод вызывается рекурсивно для всех открытых элементов Object
  • /**
     * Dumps an given Object to System.out, using the following rules:<br>
     * <ul>
     * <li> If the Object is {@link Iterable}, all of its components are dumped.</li>
     * <li> If the Object or one of its superclasses overrides {@link #toString()}, the "toString" is dumped</li>
     * <li> Else the method is called recursively for all public members of the Object </li>
     * </ul>
     * @param input
     * @throws Exception
     */
    public static void dump(Object input) throws Exception{
        dump(input, 0);
    }
    
    private static void dump(Object input, int depth) throws Exception{
        if(input==null){
            System.out.print("null\n"+indent(depth));
            return;
        }
    
        Class<? extends Object> clazz = input.getClass();
        System.out.print(clazz.getSimpleName()+" ");
        if(input instanceof Iterable<?>){
            for(Object o: ((Iterable<?>)input)){
                System.out.print("\n"+indent(depth+1));
                dump(o, depth+1);
            }
        }else if(clazz.getMethod("toString").getDeclaringClass().equals(Object.class)){
            Field[] fields = clazz.getFields();
            if(fields.length == 0){
                System.out.print(input+"\n"+indent(depth));
            }
            System.out.print("\n"+indent(depth+1));
            for(Field field: fields){
                Object o = field.get(input);
                String s = "|- "+field.getName()+": ";
                System.out.print(s);
                dump(o, depth+1);
            }
        }else{
    
            System.out.print(input+"\n"+indent(depth));
        }
    }
    
    private static String indent(int depth) {
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<depth; i++)
            sb.append("  ");
        return sb.toString();
    }
    
    2
    ответ дан Michael A. Schaffrath 20 August 2018 в 21:49
    поделиться

    Следующее является компактным и избегает цикла в вашем примере кода (и дает вам хорошие запятые):

    System.out.println(Arrays.toString(list.toArray()));
    

    Однако, как указывали другие, если у вас нет разумного toString ( ), реализованные для объектов внутри списка, вы получите указатели объектов (на самом деле, хэш-коды), которые вы наблюдаете. Это верно, находятся ли они в списке или нет.

    333
    ответ дан Renaud 20 August 2018 в 21:49
    поделиться
    • 1
      Как насчет только list.toString(). – Jaskey 13 November 2014 в 05:24
    • 2
      Просто использование «list.toString ()» не будет печатать отдельные элементы, если только это не является индивидуальной реализацией интерфейса List, которая переопределяет нормальное поведение (чтобы больше печатать имя класса и хеш-код). – Holly Cummins 30 December 2014 в 08:30
    • 3
      Если они используют пользовательский класс и не переопределяют toString, ваше решение также печатает имя своего класса и хеш-код. – Jaskey 31 December 2014 в 02:39
    • 4
      Как насчет System.out.println (list)? Оно работает. – Sam003 15 April 2015 в 18:14
    • 5
      Он печатается как [значение1, значение2, значение3]. Можем ли мы печатать как без []? – deadend 14 February 2017 в 04:54

    попытайтесь переопределить метод toString (), поскольку вы хотите, чтобы этот элемент был напечатан. поэтому способ печати может быть следующим:

    for(int i=0;i<list.size();i++){
        System.out.println(list.get(i).toString());
    } 
    
    0
    ответ дан riccardo_castellano 20 August 2018 в 21:49
    поделиться
    • 1
      Это то, что делает код OP. Вызов toString неявный. – Karl Richter 16 November 2017 в 18:36
    • 2
      симпатичный старый школа. если вы напишете это, вы будете считаться программистом / разработчиком предыдущего столетия. :) – Diablo 22 February 2018 в 12:08

    Или вы можете просто использовать утилиты Apache Commons:

    https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ArrayUtils .html # toString-java.lang.Object -

    List<MyObject> myObjects = ...
    System.out.println(ArrayUtils.toString(myObjects));
    
    3
    ответ дан Romain VDK 20 August 2018 в 21:49
    поделиться
       List<String> textList=  messageList.stream()
                                .map(Message::getText)
                                .collect(Collectors.toList());
    
            textList.stream().forEach(System.out::println);
            public class Message  {
    
            String name;
            String text;
    
            public Message(String name, String text) {
                this.name = name;
                this.text = text;
            }
    
            public String getName() {
                return name;
            }
    
          public String getText() {
            return text;
         }
       }
    
    -1
    ответ дан sharath 20 August 2018 в 21:49
    поделиться
    • 1
      Что этот код будет делать? пожалуйста, дополните. – Hizqeel 28 February 2017 в 00:24

    Я сейчас работаю над этим ...

    List<Integer> a = Arrays.asList(1, 2, 3);
    List<Integer> b = Arrays.asList(3, 4);
    List<int[]> pairs = a.stream()
      .flatMap(x -> b.stream().map(y -> new int[]{x, y}))
      .collect(Collectors.toList());
    
    Consumer<int[]> pretty = xs -> System.out.printf("\n(%d,%d)", xs[0], xs[1]);
    pairs.forEach(pretty);
    
    0
    ответ дан wayneseymour 20 August 2018 в 21:49
    поделиться
    3
    ответ дан inspired_learner 31 October 2018 в 16:53
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: