Я всегда находил, что инструкция оператора java не такая мощная, насколько мне нужно. В его last release lambdaj implements it с умным использованием закрытия и Hamcrest матчер.
Например, lambdaj Switcher позволяет реализовать шаблон стратегии. Предположим, вам нужно переключиться между тремя алгоритмами сортировки, основанными на некоторой характеристике сортируемого списка. В частности, давайте предположим, что мы алгоритм специализированы для струнных:
public List<String> sortStrings(List<String> list) {
// a sort algorithm suitable for Strings
}
еще один, который хорошо работает с небольшими списками, имеющими не более чем 100 пунктов:
public List<T> sortSmallList(List<T> list) {
// a sort algorithm suitable for no more than 100 items
}
и более общее назначение один:
public List<String> sort(List<String> list) {
// a generic sort algorithm
}
Учитывая эти 3 метода сортировки, можно создать стратегию, которая выбирает наиболее подходящий из них следующим декларативным способом:
Switcher<List<T>> sortStrategy = new Switcher<List<T>>()
.addCase(having(on(List.class).get(0), instanceOf(String.class))),
new Closure() {{ of(this).sortStrings(var(List.class)); }})
.addCase(having(on(List.class).size(), lessThan(100))),
new Closure() {{ of(this).sortSmallList(var(List.class)); }})
.setDefault(new Closure() {{ of(this).sort(var(List.class)); }});
и отсортировать список, используя лучший доступный алгоритм, вызывая Switcher:
List<T> sortedList = sortStrategy.exec(list, list);
Если вы не хотите, чтобы мозоль-офф следующего разработчика, который должен поддерживать ваши коды 100x, если/else. –
Я не знаю ... Думаю, я был бы так же раздражен 100 случаями в переключателе. :-) Пахнет плохим дизайном. – cjstehno
Всегда, потому что быстрее: http://stackoverflow.com/questions/2086529 –