Comments 55
Не могли бы вы объяснить, почему в примере с циклом функциональный подход «намного лучше», и чем именно лучше?
Самый главный аргумент тут — «Во первых, это красиво!» )).
Ну например у вас есть свойство:
var myArray = [MyType]?
В предложенном варианте можно написать что-то такое: myArray?.forEach { ... }
а в классическом случае нужно сначала проверить его на nil
, а потом уже идти циклом.
Кроме этого, ещё интересно, не получим ли мы три цикла и два создания промежуточных массивов. Или компилятор настолько умный, что сможет объединить все три операции в одну? Вот это меня больше всего напрягает в функциональщине — х.з. во что это раскроется, всё зависит от компилятора.
Когда в Google объявили о том, что они теперь официально будут использовать Kotlin для разработки под Android
Можно узнать где и когда такое объявили? На сколько я знаю, объявили только о том, что теперь плагин для поддержки Kotlin входит в поставку Android Studio с версии 3.0. О том, что они теперь официально будут использовать Kotlin для разработки никто не говорил
Ну например вот: https://techcrunch.com/2017/05/17/google-makes-kotlin-a-first-class-language-for-writing-android-apps/
Или вот: https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-now-official/
И вот: https://www.theverge.com/2017/5/17/15654988/google-jet-brains-kotlin-programming-language-android-development-io-2017
@errorok судя по минусам, ссылки вас не убедили. :)
Может я и не прав, так как мой английский не очень хорош. Но я не видел заявления Google что они будут официально на нём писать. Лишь сказали что теперь это ещё один официальный язык разработки под android. Наверное это можно понять как будто они теперь будут сами использовать Kotlin
Ээээ. Так никто и не говорит, что они сами будут писать. Фраза "официально будут использовать Kotlin для разработки под Android" подразумевает, что теперь Kotlin официально поддерживается гуглом, как язык для разработки под Android другими разработчиками. :)
"Гугл будет официально использовать котлин для разработки"
и
«поддерживается для разработки другими»
это две огромные разницы. Потому что в первом случае — сам Гугл кодит на котлине, во втором (вашем) — другие кодят, что они, собственно и раньше могли делать.
p.s. что-то слишком много пиара котлина в последнее время.
Вот примеры уже есть на оф сайте.
for (i in 0..N step 2) {
// Do something
}
for i in stride(from: 0, to: N, by: 2) {
// Do Something
}
В Kotlin эта конструкция поприятнее конечно…for (int i = 0; i < N, i += 2) {
// Do Something
}
Ещё приятнее классика…
В котлине вполне это же можно так написать:
for (i in 0 until N step 2) {}
until, step – это все функции из стандартной библиотеки.
А для циклов по коллекции можно писать вот так:
for (i in items.indices) {}
Сам range оператор (который 0..N-1) в циклах лучше не использовать, очень легко -1 забыть.
То есть, в принципе, бизнес логику написанную под Андроид можно будет легко портировать на iOS? Или я что то неправильно понимаю?
Ну бизнес-логика, как бы подразумевает отсутствие платформо-специфичных выражений.
Проблема в том, что вся мощь новых языков показывается на примерах уровня HelloWorld.
Ну серьезно, неужели в примере 1 пример с filter, map и reduce выглядит привлекательнее обычного for? Из пушки по воробьям. При попытке продать Kotlin в проекты с большим legacy подобные примеры разбиваются в клочья.
Другая проблема — излишняя восторженность от новых технологий как таковых. Ну не является Kotlin новой эпохой, нет в нем ничего такого, что было бы прямо киллер-фичей. На моей практике я никогда не был в ситуации, когда самая большая проблема проекта — это неправославный for или отсутствие лямбд. Основная проблема поддержки всегда кривая архитектура, спагетти, производительность — проблемы, которые Kotlin, увы, никак не решит (как не решит другой язык).
Повторю еще раз — я люблю Kotlin, это прекрасный язык. Но статья никак не показывает, что это «новая эпоха, позволяющая сократить затраты на рутинную разработку бизнес-логики и управление приложением».
Ну серьезно, неужели в примере 1 пример с filter, map и reduce выглядит привлекательнее обычного for?
Просто представьте что вам нужно пройти циклом по опциональной коллекции, а не обычной. :)
Когда я вижу такие статьи, мне всегда кажется, что они пишутся PR отделом JetBrains
Вы не одиноки в этом ощущении.
Ну не является Kotlin новой эпохой, нет в нем ничего такого, что было бы прямо киллер-фичей.
Абсолютно согласен. Но вокруг него прямо-таки искусственно создают buzz.
let results = mixedArray
.flatMap({ Int($0) })
.reduce(0, +)
Пишу на Swift'e, читал статьи про Kotlin и сложилось такое же впечатление, как у автора статьи.
Это все действительно здорово. Писать одно удовольствие.
В итоге программисты под iOS будут программировать на новом быстроразвивающемся языке с хорошими нативными библиотеками и документацией, с поддержкой Apple, а программисты под Android — программировать на зоопарке из сторонних костылей, которые поддерживают все сообща, а поэтому мало кто конкретно.
let mixedArray = ["4", "5", "a", "-2", "Str"]
let results = mixedArray
.filter({ (obj) -> Bool in return Int(obj) != nil })
.map { (obj) -> Int in return Int(obj)! }
.reduce(0, +)
За такое использование Swift обычно надо проводить серьезные разъяснительные беседы с автором.
В JDK доступна только статическая инициализация, но нет способа инициализировать Map в одну строку.
Нормального способа нет, но если через одно место, то можно!!!
(Внимание! Никогда не используйте этот код в рабочих проектах! Это чисто поржать!)
Map map = (Map) new ScriptEngineManager().getEngineByName("nashorn").eval("({a:'Hello',b:42,c:{c1:0.5,c2:true}})");
System.out.println(map.entrySet()); // [a=Hello, b=42, c=[object Object]]
System.out.println(map.get("a")); // Hello (String)
System.out.println(map.get("b")); // 42 (Integer)
System.out.println(((Map) map.get("c")).get("c1")); // 0.5 (Double)
System.out.println(((Map) map.get("c")).get("c2")); // true (Boolean)
Здесь бессовестно эксплуатируется библиотека javax.script и Project Nashorn, которые есть часть JDK Java 8.
Вот такое извращение, но однострочник! =)
Интересно, какой будет оверхед на запуск скриптового движка.
Ну, в принципе, можно любую java-программу записать в одну строку, но вот однострочником она от этого не станет =)
Ваш пример не масштабируется:
new HashMap<>(){{
put(key, value);
put(key2, value2);
}}
Точкой с запятой (;) в java обозначают окончание высказывания, поэтому здесь нельзя говорить об однострочном высказывании. А вот dot-нотация — это однострочник.
map{ x -> x.toInt() }
map(::toInt)
Почему Apple должна равняться на C#?
Заголовок «Kotlin и Swift. Новая эпоха в мобильной разработке?»
А в статье пшык, просто вообще нет ничего что могло бы ему соответствовать!
Ребята из Apple/Jetbrains старались столько лет работали, вложили столько труда и оценка всему этому — это всего лишь стало меньше запятых, скобок и тд
PS
Грусть ((((((
Одного беглого взгляда достаточно, чтобы понять сколько памяти будет выделено, как будет работать цикл, будут ли создаваться временные объекты и т.д. и т.п.
К сожалению своременные языки в погоне за функциональным стилем, теряют эту очевидную простоту.
Kotlin и Swift. Новая эпоха в мобильной разработке?