- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
String result = "";
for (Object obj : col) {
if (obj instanceof String) {
result += obj + SEPARATOR;
} else {
result += obj.toString() + SEPARATOR;
}
}
if (result.length() >= 2) {
result = result.substring(0, result.length() - SEPARATOR.length());
}
String toString()
This object (which is already a string!) is itself returned.
Сам давно добавил этот метод в самописные утилиты, пользуюсь до сих пор. и somebody beat me! (всмысле, напишите лучше, чем это)
Я дже джва года джу такой джойнер!
join (map.entrySet(),sep) кроет большинство случаев
а потоки не рассинхронизируются?
Таких как ты, невалидных, я пачками джойнил!!!
батчами
self-fix
Такие теги парсеру своёму будешь писать.
Слышь бля хуле тут распизделся?
Ну это можно улучшать бесконечно, лол
Я тоже когда-то написал 2 таких метода. И ни в одном из них нет тупой проверки на каждой итерации > if(sb.length() != 0)
В JDK14 варианте - allow nulls
Глянул одним глазом в сырцы гуавы - даже в гугле с этим согласны:
Итераторы же это и есть сама по себе концепция ленивых вычислений.
ОБС: вроде бы создатель Groovy так проникся Scala, что заявил, что не стал бы делать Groovy, если бы узнал о Scala вовремя.
"I can honestly say if someone had shown me the Programming in Scala book by by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I'd probably have never created Groovy."
Груви не нужен!
Динамическая типизация не нужна!
Из-за статической типизации появляются такие запутанные и тормозные штуки, как reflection.
А если есть метапрограммирование, то рефлексия не нужна. Хай живе Немерле!
вот, к примеру,вызов метода по имени;
js: почему в java я для того же эффекта должен писать тут даже php смотрится почти хорошо: смотрите, какая запись понятнее?
и это простой пример, а обычно нужно еще сложнее - скажем, недавняя реальная задача:
у данной неизвестной JPA сущности @Entity, чей класс задан generic'ом<E>,
нужно найти ее свойства, заданные либо public полями xxx, либо public геттерами getXxx(), за исключением getClass(),
с последующими чтением\записью из\в свойства по их имени "xxx",
перед этим проверяя возможность доступа конкретного User'a по его ролям, и ролям, перечисленным в аннотации @Roles({"role1","role2"}) к свойству (в поле или аксессоре).
воот. на самом деле там еще веселее, задача создать CRUD юзеринтерфейс для сущностей :З
> как это сделано в питоне
Не совсем понял по поводу питона... Идеологически там строгая динамическая типизация. Т.е., к примеру, сложить строку с числом нельзя. Это всё полито сверху утиной типизацией. В целом довольно удобно.
Задача, описанная выше, решается на питоне достаточно просто при использовании метаклассов (или декораторов, хотя метаклассы тут вроде больше подходят). В Django кажить реализовано практически тоже самое.
если переменная, поле или параметр метода обьявлен с типом, то далее тип контролируется. если же обьявление идет через def/var, то тип может меняться во время выполнения.
Очень много всего. Например, выбирать реализацию модуля, который нужно загрузить, в рантайме. Можно вызывать метод по имени, вот пример прокси: Или, например, можно переопределить способ создания класса: метакласс получает на вход то, что определил пользователь в коде, может поглядеть аттрибуты и методы, добавить новых или заменить поля (как, например, делает ORM Django). Так можно осуществлять автоматическую генерацию boilerplate кода прямо в рантайме.
Джавовская. Сразу понятно, что делается что-то зафигавыкрученное. Другое дело, если по каким-то причинам такие операции должны быть все время...
Ага, особенно, если дописать обработку всех checked exceptions, иначе код не скомпилится.
Джедаи.
Я подумал что это какая-то игрушка из серии star wars.
Хранилище солнечных ионов?
Set Union Store
http://redis.io/commands/sunionstore
Ну я тоже так прочитал. Если смотреть с точки зрения зв - логично.
Там действительно толковые парни:
Whenever possible, Guava prefers to provide utilities accepting an Iterable rather than a Collection. Here at Google, it's not out of the ordinary to encounter a "collection" that isn't actually stored in main memory, but is being gathered from a database, or from another data center, and can't support operations like size() without actually grabbing all of the elements.