@kotlin_lang

Страница 627 из 982
Kirill
09.04.2018
20:47:51
всё равно вроде в пять строк укладывается :)

Жабра
09.04.2018
20:53:06
Google
Руслан
09.04.2018
20:55:28
Валидный)
fun capitalize(str: String): String { return buildString(str.length) { var started = false var capitalizeNext = false for (curr in str) { if (curr == '_') { if (started) capitalizeNext = true } else { if (capitalizeNext && started) { append(curr.toUpperCase()) capitalizeNext = false } else { started = true append(curr) } } } } }

@larev жду вариант на джаве

Руслан
09.04.2018
21:09:26
Давай по делу) Я написал тебе O(N) на Котлине, я так понял были к нему какие-то вопросы. Предлагаю тебе поупражняться в джаве и показать как там лучше и чего в котлине не хватает

Руслан
09.04.2018
21:10:19
Я даже тест кейзы зашарю, если вдруг решишь поддержать class CapitalizeTest { @Test fun `test capitalize function`() { assertAll( { assertEquals("fuckFuckFuck", capitalize("fuck_fuck_fuck")) }, { assertEquals("fuckFuckFuck", capitalize("fuck____fuck_fuck___")) }, { assertEquals("fuckFuckFuck", capitalize("_____fuck____fuck_fuck___")) }, { assertEquals("fuckFUckFuck", capitalize("_____fuck____f_uck_fuck___")) }, { assertEquals("fuck", capitalize("_____fuck_____")) }, { assertEquals("fuck", capitalize("_____fuck")) }, { assertEquals("fuck", capitalize("fuck_____")) } ) } }

Руслан
09.04.2018
21:19:06
Всмысле

Pavel ?
09.04.2018
21:19:21
Или до этого что-то иное было?

До котлина всмысле

Руслан
09.04.2018
21:19:50
А, ты про бекграунд, да, раньше на джаве писал

Google
Sergey
09.04.2018
21:23:01
а у вас тут весело

"fooo___bar".replace("_+([a-z])?".toRegex()) { it.groupValues[1].toUpperCase() }

Pavel ?
09.04.2018
21:24:05
Регексы дорого

Руслан
09.04.2018
21:24:06
Тесты прогнал?

Pavel ?
09.04.2018
21:24:45
Тесты прогнал?
Нет, я завтра, я сейчас с планшета, отпишусь

Руслан
09.04.2018
21:24:58
Я Сергею :)

Sergey
09.04.2018
21:25:52
"foo__bar", "foo___", "____bar", "foo_bar" fooBar foo Bar fooBar

Регексы дорого
давай тесты, чо)

Руслан
09.04.2018
21:26:20
Бар должен быть ловер кейзом наверное

Sergey
09.04.2018
21:27:45
foo1bar?

Pavel ?
09.04.2018
21:27:59
Вполне)

foo1bar?
И давай без регекспов

Sergey
09.04.2018
21:31:47
тогда вариант @HeapyHop )

Pavel ?
09.04.2018
21:32:02
А если ____1fuck
_12foo_Bar_foo___

Sergey
09.04.2018
21:32:26
fun capitalize(str: String) = buildString(str.length) { var started = false var capitalizeNext = false for (curr in str) if (curr == '_') { capitalizeNext = started } else if (capitalizeNext && started) { append(curr.toUpperCase()) capitalizeNext = false } else { started = true append(curr) } }

Pavel ?
09.04.2018
21:32:29
тогда вариант @HeapyHop )
Попробую завтра)

Google
Pavel ?
09.04.2018
21:38:33
Можете меня забросать ссаными тряпками

Kirill
09.04.2018
21:39:13
Можете меня забросать ссаными тряпками
забросать тапками, тряпками — гнать

Руслан
09.04.2018
21:40:47
Главное чтобы тесты были, а чистое говно и переписать можно :)

Sergey
09.04.2018
21:46:50
мы ж на котлине пишем епта

fun capitalize(str: String) = buildString(str.length) { var started = false var capitalizeNext = false for (curr in str) when { curr == '_' -> capitalizeNext = started capitalizeNext && started -> { append(curr.toUpperCase()); capitalizeNext = false } else -> {started = true; append(curr)} } }

Но это пока выглядит как говно
мне аж интересно взглянуть на твою реализацию на джаве

Marat
10.04.2018
02:46:53
и всегда тут так весело?)

Vitalii
10.04.2018
06:59:06
? fun capitalize(word: String): String { val list = word.toMutableList() return list.filterIndexed { i, c -> if (c == '_' && i < word.length - 1) { list[i + 1] = list[i + 1].toUpperCase() } c != '_' }.joinToString("") }

Sergey
10.04.2018
07:01:04
мутировать массив внутри filter это как-то совсем дерзко)

Жабра
10.04.2018
07:02:55


Vitalii
10.04.2018
07:04:12
Это фильтр. @Enleur, там новый мутабельный объект создаётся, word не мутируется: https://github.com/JetBrains/kotlin/blob/1.2.30/libraries/stdlib/src/generated/_Arrays.kt#L7829

Жабра
10.04.2018
07:06:31
Это фильтр. @Enleur, там новый мутабельный объект создаётся, word не мутируется: https://github.com/JetBrains/kotlin/blob/1.2.30/libraries/stdlib/src/generated/_Arrays.kt#L7829
А, я понял суть вашей идеи. Ну, имхо, такое себе, лучше разнести на два действия. Будет и читабельнее, и понятнее.

Boris
10.04.2018
07:58:46
Есть идея менее производительная, но более функциональная, как до дома доберусь пришлю

fun String.toCamelCase(): String = buildString { tokenize().filter { it.isNotEmpty() }.forEachIndexed { i, it -> if(i == 0) append(it) else append(it.substring(0, 1).toUpperCase()).append(it.substring(1)) } } private fun String.tokenize(): Sequence<String> { val stringTokenizer = StringTokenizer(this, "_") return generateSequence { if (stringTokenizer.hasMoreTokens()) stringTokenizer.nextToken() else null } } сори, не тестил

Vladislav
10.04.2018
09:03:54
Если я делаю list.map ... .map. map. Список при этом будет перевыделяться?

надо ли делать дополнительно list.asSequence().map.map.map.join чтобы было оптимальнее?

Alexey
10.04.2018
09:04:48
А какой размер списка?

Google
Vladislav
10.04.2018
09:04:56
ну небольшой

Alexey
10.04.2018
09:05:44
На малых размерах зачастую дешевле выделить память, чем создавать ленивые итераторы

Vladislav
10.04.2018
09:06:19
так он всё-таки перевыделяет память?

Quantum Harmonizer
10.04.2018
09:06:33
Vladislav
10.04.2018
09:06:53
да, точно (

Руслан
10.04.2018
09:07:46
да, точно (
А теперь потестай с jmh листы до 100 элементов со стримами/сиквенсами и стандартные котлиновские

map/forEach/filter/etc еще и inline делает

Vladislav
10.04.2018
09:08:10
jmh это что?

Quantum Harmonizer
10.04.2018
09:11:39
https://lmgtfy.com/?q=jmh

Bogdan
10.04.2018
09:15:27
Руслан
10.04.2018
09:19:46
https://www.youtube.com/watch?v=xH-RZ9YlxH0

Я знаю у нас в чате много языковых архитекторов, думаю доклад будет релевантен :)

Bogdan
10.04.2018
09:27:10
https://www.youtube.com/watch?v=xH-RZ9YlxH0
спасибо за оперативность)

Vladimir
10.04.2018
09:29:14
Dmitry
10.04.2018
09:30:42


Vladislav
10.04.2018
09:32:56
Сделал такой тест: @State(value = Scope.Benchmark) open class MyBenchmark { val list = listOf("1", "2", "3", "4") @Benchmark fun testSequenceMap() { val result = list.asSequence().map { "!$it" }.map { "$it!" }.toList() } @Benchmark fun testListMap() { val result = list.map { "!$it" }.map { "$it!" }.toList() } } В итоге sequence чутка быстрее работает.

Vladislav
10.04.2018
09:33:36
как ничего?

Руслан
10.04.2018
09:33:56
Ну там строго не запрещается :) В прошлом году один из спикеров расшарил видео вместе с плейлистом, Федеров пришел и побил по рукам за плейлист, но единичное видео не запрещал

Google
Руслан
10.04.2018
09:35:02
Vladislav
10.04.2018
09:35:25
Читайте доку по JMH, сударь. Компилятор в праве выкинуть весь этот код.
Но он это не делает, пустой метод выполняется со скоростью 3525918577 ops/s, а эти 6047392,174 ops/s. Значит что-то он всё-таки делает

Quantum Harmonizer
10.04.2018
09:37:00
6 млн/сек
действительно, 350 млн против 6 млн

Vladislav
10.04.2018
09:37:04
warmup там делается, но время от этого не сильно меняется

но там возвращается iterable, а для чистоты эксперимента нужен list. попробую iterable кастануть к листу

Vladislav
10.04.2018
09:38:36
а да, точно

секвенсы потяжелее, первая непрогретая итерация прямо заметно медленнее, чем после прогрева

Страница 627 из 982