ФП в java

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

В силу определенных обстоятельств захотелось мне странного.

А именно какой нибуть легковесной библиотеки реализующей functional patterns для работы с коллекциями. Хотелось бы услышать байки из склепа — именно отзывы о том кто чем пользуется\плотно щупал.

Посылать в гугол меня не надо, хочется именно user experience услышать. В стиле — пользовались этим, напрягало то то.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Будете если guava активно пользовать — берегитесь Live коллекций и тяжелых итераторов/функций. Скажем,

Lists.newArray(Lists.transform(input, function))

применит функцию дважды к каждому элементу.

Lists.newArray(Lists.transform(input, function))

применит функцию дважды к каждому элементу.

Запускать и дебажить лень, посему спрошу:

А с чего бы это? (Для Итераблов/Итераторов по одному разу, вроде как)

Потому что когда оно Collection получает, то для оптимизации выделения памяти сначала опрашивает size, а потом уже итерирует. А Iterables как раз от этой засады спасают:Lists.newArrayList(Iterables.transform(input, function))

Потому что когда оно Collection получает, то для оптимизации выделения памяти сначала опрашивает size, а потом уже итерирует.

Таки надо подебажить. По коду #size делегируется исходному списку и вызывается только в AbstractCollection#toArray()

Таки да, все напутал. Не Lists.transform, а Collections2.filter, и не Function а предикат... И таки не воспроизводится, может в случаях посложнее, а может — рассосалось... :)

Я так понимаю потенциальная проблема например в том что на каждый вызов size() оно будет проходить по всей коллекции и накладывать предикат на каждый элемент колекции, что конечно не верх оптимальности.

Наверное все таки только гуава. У них самая лучшая поддержка. Вот только замыкания на ананимках очень криво выглядят.

В яве не оч красиво с ФП, если есть возможность заюзай Groovy. Его как раз за работу с коллекциями и любят groovy.codehaus.org/Collections

+1.

Груви очень легко и быстро интегрируется в проэкт. Очень хорошая совместимость, например ничего не стоит с джавы дергать класс написанный на груви. Ну и синтаксис у него «джава++».

увы пока никак. был бы выбор- скорее всего попробовали бы слесть на scala...

Хотелось бы услышать байки из склепа — именно отзывы о том кто чем пользуется\плотно щупал.

Gava. Вполне нравится. Смотрел на code.google.com/p/lambdaj , но чисто субъективно выбрал гуаву. Со статик импортами вообще хорошо.

Если есть возможность ждать до лета + 0,5-1 год, то можно подождать Java8, по докам АПИ интересное ( cr.openjdk.java.net/...mbda/sotc3.html ).

В стиле — пользовались этим, напрягало то то.

Меня лично не напрягает. Некоторых коллег не столько «напрягало», сколько «надо привыкнуть», далеко не всем понятно нах надо фильтр если можно циклом пройтись.

Из минусов гуавы, там нет reduce.

до 8ки терперь сил моих нет.
я за сегодня написал ммм ну так штук пять фильтров, зип и по мелочи. Стена кода а business value около 0. С привыкнуть проблем не будет, команда злая. Есть желание сделать все правильно пока не нагнали молодежи и не стало позно\не до того.
Пока похоже при придварительном расследовании я никого не пропустил. Шорт лист пока — гуава и лямбда-j

Вообще была мысль вдохновится одним велосипедом но он оказался жирноват и хз как оптимизирован.

Стена кода а business value около 0.
Это в смысле анонимные классы?
Если да, то или ставим ИДЕА :) или в самых жутких местах выносим в иннер-классы/методы (по типу того что в гуаве, привел reality_hacker). На мой вкус — это куда понятнее чем «лямбды».

Можно писать на Guava в стиле:

List<string> p = filter(in, and(MY_PREDICATE, equalsTo("Vasya")))

но памоему изврат во многих случаях.

на гуаву смотрел, точечно пользовался... Просто думаю — вдруг я упускаю что то позволяющее избавится от проклятых foreach ( у меня их сейчас прорва) и не охренеть от длиннючих и корявых телескопических методов. еще lambdaj есть но я ее еще не пробовал.

еще lambdaj есть но я ее еще не пробовал.
Еще есть:
functionaljava.org
Людям нрависто, сам не пробовал. Из странностей, у них, вроде бы, свои реализация коллекций.

свои коллекции не очень хотелось бы, настораживает.... у меня еще и jpa есть вместо якоря

guava + hibernate нормально. Нормальная спека не должна зависеть от подлежащей имплементации скажем данного List. Ну чтоб наверняка пару тестов простых написать можно в процессе ознакомления / выбора.

У Гуавы тоже своя как правило, см. например docs.guava-libraries.googlecode.com/....base.Function

Я обычно все через итераторы делаю, так шо у меня в основном АррайЛисты получаютсо :)

Итераторы и итерабелы действительно рулят для работы с Guava’s live collections.

Чтобы не охренеть от телескопических методов делайте то же самое, что делаете для этого с кодом вообще. Extract method, declare class, etc. И следите за сокомандниками, а то потом за излишне резвыми зеалотами ни код понять ни подебажить нормально.

Підписатись на коментарі