?

Log in

No account? Create an account
dark_barker's Journal -- Day [entries|friends|calendar]
Маркер

[ userinfo | livejournal userinfo ]
[ calendar | livejournal calendar ]

функциональный подход 03.09.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<DynamicClass> & Serializable) (clazz) -> addReportDoc(clazz.getResourceSimpleName(), DynamicCodeDao.getClassFile(clazz.getClassName())));

Если вам платят за количество строк кода, то функциональное программирование не для вас. В остальных случаях оно бывает полезным.

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

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

Read more...Collapse )
41 comments|post comment

navigation
[ viewing | September 3rd, 2015 ]
[ go | previous day|next day ]