#kotlin #sandbox
Вопрос:
У меня есть этот код на java
// set of functions to transform int to String
private static final Set<IntFunction<String>> RULE_SET = new LinkedHashSet<IntFunction<String>>() {{
add(i -> i % 2 == 0 ? "buzz" : "");
add(i -> i % 3 == 0 ? "fizz" : "");
add(i -> i % 4 == 0 ? "2gis" : "");
}};
//client code
private String transformNum(int num) {
final String transformed = RULE_SET.stream()
.map(rule -> rule.apply(num))
.collect(Collectors.joining());
return transformed.length() == 0 ? String.valueOf(num) : transformed;
}
и теперь я пытаюсь преобразовать его в Котлин.
Но я чувствую, что есть гораздо более простой и легкий способ создания коллекции функций, не могли бы вы посоветовать? Вот что у меня есть сейчас. Работает, но выглядит странно для меня, как будто я использую Java в Котлине, но не сам Котлин. 🙂
private val rules = setOf<IntFunction<String>>(
IntFunction { i: Int -> if (i % 2 == 0) "buzz" else "" },
IntFunction { i: Int -> if (i % 3 == 0) "fizz" else "" },
IntFunction { i: Int -> if (i % 4 == 0) "2gis" else "" }
)
private fun transformNum(num: Int): String {
val transformed = rules.joinToString("") { rule: IntFunction<String> ->
rule.apply(num)
}
return if (transformed.isEmpty()) num.toString() else transformed
}
Комментарии:
1. Я бы предложил использовать a
List
вместо aSet
, если имеет значение порядок.
Ответ №1:
может быть, это?
val ss = setOf<(Int) -> String>(
{ i -> if (i%2 == 0) "apple" else ""},
{ i -> if (i%3 == 0) "banana" else ""},
{ i -> if (i%4 == 0) "cherry" else ""}
)
private fun transform(num: Int): String =
ss.joinToString(""){ it(num) }
.let {
if (it.isEmpty()) num.toString() else it
}
Ответ №2:
Может быть, это?
private val rules = setOf(
{ i : Int -> if (i % 2 == 0) "buzz" else "" },
{ i : Int -> if (i % 3 == 0) "fizz" else "" },
{ i : Int -> if (i % 4 == 0) "2gis" else "" }
)
и
private fun transformNum(num: Int) = rules.joinToString("") {it(num)}.run {
if (isEmpty()) num.toString() else this
}