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

Pavel ?
09.04.2018
20:47:53

Жабра
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 жду вариант на джаве

Pavel ?
09.04.2018
21:06:38

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

Pavel ?
09.04.2018
21:10:10

Руслан
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_____")) }
)
}
}


Pavel ?
09.04.2018
21:11:34
Я даже тест кейзы зашарю, если вдруг решишь поддержать
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_____")) }
)
}
}
Я котлин поддерживаю всеми конечностями) Оке)
@HeapyHop ты на жабе писал?)

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

Pavel ?
09.04.2018
21:19:21
Или до этого что-то иное было?
До котлина всмысле

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

Google

Pavel ?
09.04.2018
21:21:47

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
Бар должен быть ловер кейзом наверное

Pavel ?
09.04.2018
21:27:21

Sergey
09.04.2018
21:27:45
foo1bar?

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

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

Pavel ?
09.04.2018
21:32:02

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

Руслан
09.04.2018
21:34:51

Google

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

Kirill
09.04.2018
21:39:13

Pavel ?
09.04.2018
21:39:16

Руслан
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

Vitalii
10.04.2018
07:06:47

Igor
10.04.2018
07:07:10

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

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 чутка быстрее работает.

Руслан
10.04.2018
09:33:21

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

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

Vladimir
10.04.2018
09:34:10

Google

Dmitry
10.04.2018
09:34:40

Руслан
10.04.2018
09:35:02

Vladislav
10.04.2018
09:35:25

Руслан
10.04.2018
09:35:37

Quantum Harmonizer
10.04.2018
09:36:02

Vladislav
10.04.2018
09:36:19

Руслан
10.04.2018
09:36:32

Quantum Harmonizer
10.04.2018
09:37:00

Vladislav
10.04.2018
09:37:04
warmup там делается, но время от этого не сильно меняется
но там возвращается iterable, а для чистоты эксперимента нужен list. попробую iterable кастануть к листу

Руслан
10.04.2018
09:38:12

Vladislav
10.04.2018
09:38:36
а да, точно
секвенсы потяжелее, первая непрогретая итерация прямо заметно медленнее, чем после прогрева