В языке программирования с функциями первого класса, вы бы огибают функции в качестве параметра указывает на что вы хотите сделать внутри цикла (например, см. обновление ниже). Java будет иметь lambdas в версии 8, но они не совсем подходят для работы.
В текущем состоянии Java вам придется решить что-то более уродливое - например, передав дополнительный параметр методу; или вы могли бы пройти вокруг анонимных внутренних классов, которые реализуют интерфейс, но ИМХО это даже уродливее, чем то, что я собираюсь предложить:
static void printSomething(List<String> list, boolean print)
Если print
является true
затем распечатать внутри цикла, в противном случае добавить к Map
. Конечно, вам нужно добавить пару if
s внутри цикла для проверки этого условия, а в начале - один дополнительный if
, чтобы определить, должен ли инициализироваться Map
. В любом случае, метод возвращает Map
, но Map
может быть null
для корпуса для печати. Это то, что я имею в виду:
static Map<String, String> processSomething(List<String> list, boolean print) {
Map<String, String> map = null;
if (!print)
map = new HashMap<String, String>();
for (String item : list) {
if (item.contains("aaa")) {
if (print)
System.out.println("aaa" + item);
else
map.put("aaa", item);
}
if (item.contains("bbb")) {
if (print)
System.out.println("bbb" + item);
else
map.put("bbb", item);
} else if (print) {
System.out.println(item);
}
}
return map;
}
UPDATE
Например, в Python - что позволяет прохождение функции в качестве параметров, это то, как вы бы решить эту проблему в элегантной моды:
def processSomething(lst, func):
result = None
for item in lst:
if 'aaa' in item:
result = func(item, 'aaa', result)
elif 'bbb' in item:
result = func(item, 'bbb', result)
else:
result = func(item, '', result)
return result
def printer(item, key, result):
print key + item
def mapper(item, key, result):
if not result:
result = {}
if key:
result[key] = item
return result
Посмотрите, как это работает:
processSomething(['aaa', 'bbb', 'ccc'], printer)
=> aaaaaa
bbbbbb
ccc
processSomething(['aaa', 'bbb', 'ccc'], mapper)
=> {'aaa': 'aaa', 'bbb': 'bbb'}
Это зависит ... почему у вас есть эти 2 метода ... вы можете поделиться вызывающие методы – Frank
Возможно, вы можете использовать возвращаемое значение 'getSomething()' для выполнения распечаток в 'printSomething()'; Я пошел бы так, чтобы избежать методов, возвращающих ничего (которые не являются сеттерами c). – adrianp
@HighPerformanceMark извините за ошибку. Я имею в виду дублирование – hudi