Маркер (dark_barker) wrote,
Маркер
dark_barker

Categories:

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

Программистский лытдыбр. Как известно, 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 без лямбд» (ага, на анонимных классах и т.п.) действительно могут выглядеть намного лучше.

upd Ну, например
List<IdTitle> idTitles = new CollectionConverter<UserDevice, IdTitle>()
{
  @Override
  protected IdTitle convert( UserDevice f )
  {
    return new IdTitle( f.getId(), f.getTitle() );
  }
}.getList( devicesList );

с собственными велосипедами типа CollectionConverter превращается в одну строку на pure java:
List<IdTitle> idTitles = devicesList.stream().map(f->new IdTitle( f.getId(), f.getTitle() )).collect(Collectors.toList());
Tags: [лытдыбр], программизм
Subscribe
promo dark_barker december 12, 2010 19:27 52
Buy for 10 tokens
Разговаривали вчера в одной очень интеллигентной компании (западловский, привет) и речь зашла о разных интересных и пикантных вещах. После той беседы я сегодня весь день думаю -- а ведь и правда, почему а наши дни женщины так не любят делать глубокий книксен? Ведь что для мужчины может быть лучше…
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 41 comments

Besttotaren

September 3 2015, 10:39:44 UTC 3 years ago

  • New comment
купи себе молескин и пиши туда подобную хуйню. я вообще не пойму, я за интернет плачу, чтоб вот это вот читать?!?!?!?