Поток списка Java, получить все элементы или только один? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть метод, который возвращает Arraylist элементов.Иногда мне нужен весь список, а иногда просто проверить, не является ли результирующий список не пустым (просто bool).

Поскольку этот метод выполняет некоторые тяжелые задачи, чтобы проверить, следует ли что-то добавить в список результатов,Есть ли способ разбить метод в случае, если он добавляет один элемент в список ??

Я хотел бы использовать тот же метод, но иногда ломать, если один элемент добавляется в список, а иногда и позволить емусделать всю работу (и добавить все остальное).

Я могу передать некоторые логические флаги, которые будут указывать, должен ли метод прерываться, когда происходит событие добавления первого элемента, но мне интересно, есть ли более элегантное решение (с потоком или чем-то ...).

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

List<String> getData(argument) {
  List<String> elements = new ArrayList<>;
  ... // do some heavy stuff that produces flag 'shouldAddElement'

  if (shouldAddElement) {
    elements.add('a');
  }

  if (someCondition) {
    elements.addAll(getData(argument));
  }

  return elements;
}

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Это не очень элегантно.но вы можете использовать тот факт, что список изменчив.Смотрите этот простой пример:

List<String> list = new ArrayList<>();
list.add("A");  list.add("B");  list.add("C");
manipulateList(list);
System.out.println(list);

, где manipulateList определяется как:

void manipulateList(List<String> list) {
    list.add("D");
}

Распечатка после манипуляции:

[A,B, C, D]

Обратите внимание, что вы не использовали возвращаемое значение метода.Возвращает пустоту.Таким образом, вы можете получить манипулированный список, не возвращая его вашему методу.Теперь заставьте manipulateList вернуть boolean, который вы можете использовать по мере необходимости.Что-то вроде:

boolean manipulateList(List<String> list, boolean stopOnconditionMet) {

    while (...) {//represents the long process

        if(conditionMet && stopOnconditionMet ) {
            return true;
        }
    }

    return false
} 

Вы также можете добавить удобный метод:

List<String> manipulateList(List<String> list) {
    manipulateList(list, false);
    return list;
}
0 голосов
/ 24 мая 2018

В метод можно передать предикат shouldContinue (или даже эквивалентно shouldStop), и на основе оценки предиката вы можете решить продолжить / остановить.

Однако добавив этот параметр впубличный метод может показаться не совсем подходящим, поэтому вы можете создать два метода - один, который останавливается после добавления одного элемента, и другой, который продолжает работу (поскольку в любом случае вызывающая сторона должна решить, останавливаться ли после одного элемента или продолжать (если вырешите передать флаг) - так, у вас вполне может быть два метода ИМО).

List<String> getOneElementData(argument) {
    return getDataInternal(argument, elements -> elements.size < 1);
}

//You can even extend the above to take the desired final list size as a parameter
// and have the predicate as elements -> elements.size < desiredSize

List<String> getData(argument) {
      return getDataInternal(argument, elements -> true); //Always keep going
}

private List<String> getDataInternal(argument, Predicate<List<String>> shouldContinue) {
  List<String> elements = new ArrayList<>;
  ... // do some heavy stuff that produces flag 'shouldAddElement'

  if (shouldAddElement) {
    elements.add('a');
  }

  if (someCondition && shouldContinue.test(elements)) {
    elements.addAll(getData(argument));
  }

  return elements;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...