Маркер (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

  • Валютные ипотечники

    Давно не писал про странных людей. Эти товарищи хотели немного схитрить и выгадать, но облажались. Замечу, здесь нет никакого злорадства, бывает…

  • водка

    Да, я люблю водку. Недавно в одном из походов я услышал: «Не могу пить водку в чистом виде, без запивки и т.д., мне всё в ней не нравится, она…

  • ал.банки

    Прошлым летом накопил на даче кучу алюминиевых банок от пива. Мы их плющили в плотную лепёшку и в ящик кидали. Привёз на днях большой мешок этих…

  • 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 5 years ago

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

  • Валютные ипотечники

    Давно не писал про странных людей. Эти товарищи хотели немного схитрить и выгадать, но облажались. Замечу, здесь нет никакого злорадства, бывает…

  • водка

    Да, я люблю водку. Недавно в одном из походов я услышал: «Не могу пить водку в чистом виде, без запивки и т.д., мне всё в ней не нравится, она…

  • ал.банки

    Прошлым летом накопил на даче кучу алюминиевых банок от пива. Мы их плющили в плотную лепёшку и в ящик кидали. Привёз на днях большой мешок этих…