Дедлайн: 2015/03/21 23:59
- Необходимо создать следующие абстрактные классы:
Function1
— функция одного аргумента (f(x)
)Function2
— функция от двух аргументов (f(x,y)
)Predicate
— предикат для одного аргумента
Подумайте как лучше применить наследование чтобы выстроить из них иерархию.
- В рамках этиx абстрактных классов нужно создать:
Function1.compose
— композиция. ПринимаетFunction1
—g
, возвращаетg(f(x))
Function2.compose
— композиция. ПринимаетFunction1
—g
, возвращаетg(f(x,y))
Function2.bind1
— bind первого аргумента. Принимает первый аргумент, возвращаетf(_, y)
Function2.bind2
— bind второго аргумента. Принимает и второй аргумент, возвращаетf(x, _)
Function2.curry
— каррирование, конвертация вFunctiton1
.Predicate.or
/Predicate.and
. Принимают один предикат в качестве аргумента, возвращают предикат, который ведет себя, как дизъюнкция/конъюнкция текущего предиката и предиката-аргумента. Семантика ленивая, как у||
и&&
.Predicate.not
принимает 0 аргументов, возвращает предикат-отрицание текущего предиката- Константные статические предикаты:
Predicate.ALWAYS_TRUE
,Predicate.ALWAYS_FALSE
- Cоздать класс
Collections
со следующими статическими методами, оперирующими коллекциями интерфейсаIterable
и функциями реализованными через вышенаписанные абстрактные классы:
map
— принимает аргумент-функциюf
и коллекциюa
, применяетf
к каждому элементу коллекцииa_i
и возвращает новую коллекцию с элементами[f(a_1), ..., f(a_n)]
filter
— принимает предикатp
и коллекциюa
, возвращает коллекцию, содержащую элементыa_i
на которыхp(a_i) == true
takeWhile
— принимает предикатp
и коллекциюa
, возвращает начало коллекции до первого элементаa_i
для которогоp(a_i) == false
takeUnless
— то же, что иtakeWhile
, только дляp(a_i) == true
foldr
/foldl
— принимает функцию двух аргументов, начальное значение и коллекцию. Работает [так] (https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%91%D1%80%D1%82%D0%BA%D0%B0_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0)
- Покрыть написанный код тестами по максимум. Подробнее о том, как посмотреть coverage написано в README в ветке master. Создавать новые тесты можно на основе примера из первого задания.
- Сигнатуры классов и методов должны быть одновременно максимально гибкими (наиболее общими), и при этом не должны содержать лишних generic-параметров (т.е. по возможности следует использовать wildcard).
- Серия статей о дженериках на сайте Oracle. Особенно рекомендуется к прочтению статья про wildcards и про generic methods.