w języku programowania z funkcji pierwszej klasy, którą przechodzą wokół funkcji jako parametr wskazujący co chcesz zrobić w pętli (na przykład patrz aktualizacja, poniżej). Java będzie miała lambdas w wersji 8, ale nie są one w stanie wykonać tej pracy.
W bieżącym stanie Java będziesz musiał zadowolić się czymś brzydszym - na przykład przekazując dodatkowy parametr do metody; lub można przejść wokół anonimowych klas wewnętrznych, które implementują interfejs, ale IMHO to jeszcze brzydsze niż to, co mam zamiar zaproponować:
static void printSomething(List<String> list, boolean print)
Jeśli print
jest true
następnie wydrukować wewnątrz pętli, w przeciwnym razie dodać do Map
. Oczywiście w pętli musisz dodać kilka if
s w celu sprawdzenia tego warunku, a na początku jeszcze jeden if
, aby ustalić, czy należy zainicjować Map
. Tak czy inaczej, metoda zwraca Map
, ale Map
może być null
dla przypadku drukowania. To, co mam na myśli:
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
Na przykład w Pythonie - co pozwala przejściu funkcji jako parametry, to jak chcesz rozwiązać problem w eleganckim mody:
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
Zobacz, jak to działa:
processSomething(['aaa', 'bbb', 'ccc'], printer)
=> aaaaaa
bbbbbb
ccc
processSomething(['aaa', 'bbb', 'ccc'], mapper)
=> {'aaa': 'aaa', 'bbb': 'bbb'}
To zależy ... dlaczego masz te 2 metody ... można dzielić metody wywołujące – Frank
Prawdopodobnie mógłbyś użyć zwracanej wartości 'getSomething()', aby wykonać wydruki w 'printSomething()'; Poszedłbym tą drogą, aby uniknąć metod, które nie zwracają niczego (które nie są ustawiaczami c). – adrianp
@HighPerformanceMark przepraszam za pomyłkę. Mam na myśli duplikację – hudi