Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
if(set.add(item)) {
if(file.delete())
или if(folder.mkdirs())
. Тут побочный эффект явно есть. И даже какой-нибудь if(matcher.find())
меняет состояние объекта — заполняет группы.file.delete()
и file.mkdirs()
— это части устаревшего API. В NIO.2 ничего подобного, к счастью, нет.boolean wasAdded = set.add(item);
if (wasAdded) {
put(...put( ))
— довольно экстремальный пример, поэтому его стоит вынести в метод типа swapValues(map, key1, key2)
, тогда всё станет гораздо понятнее.If the specified key is not already associated with a value (or is mapped to null) associates it with the given value and returns null, else returns the current value.
If the specified key is not already associated with a value (or is mapped to null) associates it with the given value and returns null, else returns the current value.
Если указанный ключ ещё не связан с каким либо значением (или значение — null), связывает его с заданным значением и возвращает null, в ином случае возвращает его текущее значение.
void processItems(final Iterable<Item> items) {
for (final Item item : items) {
...
}
}
Iterable
если, конечно, не нужен какой-нибудь специфичный для класса коллекции методsize() сюда же. Разумеется, Iterable не подходит для случаев, когда вы нужно знать точное количество элементов. Впрочем, это зависит от задачи.
Вы не сможете работать с большим количеством полезных функций из Collections (guava несколько исправляет эту проблему, но тем не менее)
Вы не сможете легко и просто создать stream в Java 8Согласен. Впрочем, зато я легко смогу использовать totallylazy, которая функционально (нечаянный каламбур) гораздо богаче Stream из Java 8, частично заменяет Collections и доступна на Android (с Retrolambda идёт на ура).
В целом, я бы крайне осторожно использовал бы замену Collection на Iterable в больших функциях, чтобы не пришлось рефакторить пол приложения, когда потребуется Collection или не делать костыли и терять производительность.Заменять и не надо. Просто пишите новые алгоритмы, исходя из принципа минимализма: нужна последовательность — принимай Iterable, понадобится менять последовательность — меняешь на Collection (не надо переписывать половину кода для этого).
final int color = option(json.optString("some_color", null))
.filter(not(String::empty))
.flatMap(Color::parseColor)
.getOrElse(Color.WHITE);
view.setBackgroundColor(color);
Iterable<T>
, а Collection<T>
.equals
сначала проверяет одинаковость классов объектов. А с «производными» списками неодинаковость классов практически гарантирована.Если есть необходимость вставки в середину, то надо использовать LinkedList, и то, что эта задача названа экзотической, ничего не меняет.Очень сильно зависит от условий. Часто копирование линейного куска памяти много дешевле, чем выделение нового LL.Node и модификация ещё двух соседних.
Не считая дикого насилия над кэшем и отсутствия нормального prefetch при итерации по LL.Это, пожалуй, самый важный момент. К тому же, если блок памяти целиком помещается в cache line, это полностью устраняет задержки на чтение RAM, поэтому экономить память и держать данные близко друг к другу очень важно для обеспечения максимальной производительности. Хотя JVM/Dalvik вряд ли дадут выжать из процессора все соки.
Коллекции в Java: о чём многие забывают