функциональный подход

Sep 03, 2015 15:17

Программистский лытдыбр. Как известно, java-программисты много лет страдали без функциональщины и прочих лямбд. Я лично джва года ждал (на самом деле лет десять), когда подобный код:

DynamicCodeDao dcd = new DynamicCodeDao(con);
for(DynamicClass clazz : dcd.getDynamicClasses())
{
if("rep.xml".equals(clazz.getResourceExt()) && clazz.getResourceSimpleName().startsWith( module ))
{
addReportDoc(clazz.getResourceSimpleName(), DynamicCodeDao.getClassFile(clazz.getClassName()));
}
}
будет вызывать зудъ и желание поскорее переписать его в такую красоту:

new DynamicCodeDao(con).getDynamicClasses().stream().filter(clazz -> "rep.xml".equals(clazz.getResourceExt()) && clazz.getResourceSimpleName().startsWith( module )).forEach( (ThrowingConsumer & Serializable) (clazz) -> addReportDoc(clazz.getResourceSimpleName(), DynamicCodeDao.getClassFile(clazz.getClassName())));
Если вам платят за количество строк кода, то функциональное программирование не для вас. В остальных случаях оно бывает полезным.

Ещё в этом коде можно увидеть изящный (как и все костыли) велосипед ThrowingConsumer, который маскирует checked exception, который может выкинуться методом addReportDoc. А с ними тут нельзя, ну вы в курсе. Как и в курсе, что подавляющее большинство используемых в java исключений являются checked. Сначала выглядит невероятным, но через подобное приведение действительно работает.

На самом деле пост лишь слегка ироничный, функциональщине в java место находится. Те куски, которые настолько просились в ФП, что уже были написаны функционально на «старой java без лямбд» (ага, на анонимных классах и т.п.) действительно могут выглядеть намного лучше.

upd Ну, например

List idTitles = new CollectionConverter()
{
@Override
protected IdTitle convert( UserDevice f )
{
return new IdTitle( f.getId(), f.getTitle() );
}
}.getList( devicesList );
с собственными велосипедами типа CollectionConverter превращается в одну строку на pure java:

List idTitles = devicesList.stream().map(f->new IdTitle( f.getId(), f.getTitle() )).collect(Collectors.toList());

[лытдыбр], программизм

Previous post Next post
Up