Есть ли способ очистить arraylist, но не почтить память? - PullRequest
2 голосов
/ 26 января 2020

Это релевантная часть моего кода:

    List<List<String>> list2 = new ArrayList<>();
    public void process(List<String> z) {
        if (z.size() > 0) {
            String x = z.get(0);

            List<String> temp = new ArrayList<>();

            z.stream().filter(e -> !e.equals(x)).forEach(e -> {
                // some operations on temp
            });

            list2.add(temp);                   // adding temp to list2

            z.removeIf(e -> temp.contains(e));
            temp.clear();                      // clearing temp

            z.forEach(System.out::println);
            list2.forEach((System.out::println));   // empty list2

            process(z);
            list2.forEach(e -> process(e));
    }

Я должен очистить temp перед рекурсивным вызовом process.
Проблема в том, что мой list2 становится пустым после очистки temp.
Поскольку я использую temp внутри лямбда-выражения, я не могу переназначить его как null или new ArrayList<>() (иначе это сработало бы).

Я думал о создании нового Списка и копировании между временным и новым Списком, но это не похоже на правильный подход.
Есть ли другой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Хотя этот ответ решает проблему очистки списка, когда он находится в другом списке, реальный ответ - в комментарии Turing85 , что нет необходимости очищать temp, поскольку temp является локальным.


Если вы хотите очистить temp без очистки записей в этом списке, которые вы вставили в list2, вы не можете вставить temp в list2, а затем очистить temp, так как temp и запись в list2 указывают на один и тот же список .

Вместо этого вставьте копию:

list2.add(new ArrayList<>(temp));

Затем, когда Вы очищаете temp, новый список, который вы поместили в list2, не будет затронут.

0 голосов
/ 26 января 2020

Используйте это list2.add (temp.stream (). Collect (Collectors.toList ()));
вместо list2.add (temp);

...