我正在尝试使用具有reified类型的函数作为扩展函数,但我不认为这是可能的,因为在我检查生成的字节码后我发现方法签名是私有的,是否有任何解决方法使其公开?
CommonExtensions.kt
inline fun<reified T: Activity> Context.startActivity() {
val intent = Intent(this, T:: class.java)
startActivity(intent)
}
fun View.visible() {
visibility = View.VISIBLE
}
Run Code Online (Sandbox Code Playgroud)
Kotlin字节码:
private final static startActivity(Landroid/content/Context;)V
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
...
Run Code Online (Sandbox Code Playgroud)
客户代码:
Kotlin文件
override fun showMessageEmptyOfferFeeds() {
mOfferFeedsWarning.visible() // "visible()" extension func RESOLVED
}
Run Code Online (Sandbox Code Playgroud)
Java文件
showProfileDetailsUi(){
startActivity<DetailActivity>() //"startActivity()" extension func NOT RESOLVED
}
Run Code Online (Sandbox Code Playgroud) java kotlin kotlin-android-extensions kotlin-reified-type-parameters
我正在看这个Kotlin对象声明:
object A : B({
variableName1 = "text1"
variableName2 = "text2"
params {
param("Foo", "Bar")
}
})
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚B类构造函数的参数是什么.
我有目的地在这个例子中抽象出信息,但实际上是B类
jetbrains.buildServer.configs.kotlin.v10.BuildType
Run Code Online (Sandbox Code Playgroud)
我找不到该类型的文档.我发现了一些接近的东西,但它是一个接口的定义,因此没有构造函数.
总而言之,Kotlin的以下构造是什么?
{
variableName1 = "text1"
variableName2 = "text2"
params {
param("Foo", "Bar")
}
}
Run Code Online (Sandbox Code Playgroud) 我想将 a 附加View.OnClickListener到 a Button。我不想OnClickListener成为内联匿名函数定义。相反,我想在onCreateView()函数范围之外定义它。
在 Java 中,我会这样做:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.my_layout, container, false);
View my_btn = view.findViewById(R.id.my_btn);
my_btn.setOnClickListener(handleButtonClick);
return view;
}
View.OnClickListener handleButtonClick = new View.OnClickListener()
{
@Override public void onClick(View v)
{
Log.d("my_tag", "click!")
}
}
Run Code Online (Sandbox Code Playgroud)
其他答案似乎表明以下内容可行,但它不适合我:
override fun onCreateView(name: String?, context: Context?, attrs: AttributeSet?): View
{
var view = super.onCreateView(name, context, attrs)
my_btn.setOnClickListener( handleButtonClick )
return view
}
private val …Run Code Online (Sandbox Code Playgroud) 我试图在列表中找到符合条件(过滤)的前两个元素,为此我在kotlin中实现了以下代码:
val arr = 0 until 20
val res = arr.filter { i ->
println("Filter: $i")
i % 2 == 0
}.take(2)
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到我意识到它过滤整个列表,无论是否找到了这两个元素.
使用Java 8 stream api,它按预期工作.
val res2 = arr.toList().stream()
.filter { i ->
println("Filter: $i")
i % 2 == 0
}.limit(2)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是如果只使用Kotlin功能就可以实现.
我知道我可以使用一个简单的for循环,但我想使用函数式编程方法.
我有一个列表,(x, y)其中y只能是 0 或 1 像这样
例如 :
[(3, 0), (3, 1), (5, 1)]
[(5, 0), (3, 1), (5, 1)]
[(1, 1), (3, 1), (5, 1)]
[(3, 0), (4, 0), (5, 1)]
[(5, 0), (4, 0), (5, 1)]
[(1, 1), (4, 0), (5, 1)]
[(3, 0), (3, 1), (5, 1)]
[(5, 0), (3, 1), (5, 1)]
[(1, 1), (3, 1), (5, 1)]
Run Code Online (Sandbox Code Playgroud)
如何对列表进行排序以使最多的子列表y = 0位于顶部?
我正在启动 Kotlin 并希望以构建器语法的模式配置Arrayof Labels。我想出了 Kotlin 标准库函数 ( apply) 和集合上的辅助函数 ( forEach)。将其称为构建器模式是否正确?这对我来说意味着声明、分配和配置在一行/一步中完成。我很欣赏任何关于如何以更紧凑和清晰的“Kotlin 式”方式编写它的想法,或者这或多或少是首选的 Kotlin 语法。顺便说一句,有很多方法可以解决这个问题(使用let而不是apply不返回接收器)。
val labels = arrayOf(Label("A"),Label("B"),Label("C"),Label("D")).apply {
this.forEach { it.prefWidth = 50.0 }
}
Run Code Online (Sandbox Code Playgroud) 第 5 行和第 6 行错误。
Kotlin:类型不匹配:推断类型为 String 但预期为 String.Companion
class Robot (name: String,color :String) {
var roboName= String
var roboColor= String
init {
this.roboName=name
this.roboColor=color
}
fun makeBed()
{
println("I will make your bed.")
}
}
fun main(args: Array<String>){
var robot1=Robot("Robot1","Black")
println(robot1.roboName)
println(robot1.roboColor)
robot1.makeBed()
}
Run Code Online (Sandbox Code Playgroud) 我想迭代给定Joda间隔内的所有日期:
val interval = Interval(DateTime.now().minusDays(42), DateTime.now())
Run Code Online (Sandbox Code Playgroud)
如何在Kotlin中做到这一点?
在 Kotlin 中,let如果对象(let接收者)不是null,则执行代码是很常见的,作为if != null检查的替代方法,如下所示:
val nullable: String? = "anything"
nullable?.let {
println(it)
}
Run Code Online (Sandbox Code Playgroud)
在其他什么情况下使用let?
仅供参考,let是 Kotlin 标准库的一部分,定义如下:
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
Run Code Online (Sandbox Code Playgroud) 我正在编写一个迭代一个集合的函数,并找到其中最常见的项目.
以下是我到目前为止获取值并添加它们在集合中出现的次数.我将值作为键放在地图中,并将其显示为其值的次数.
fun mostCommon(input: Collection<Int>): Set<Int> {
var newMap: MutableMap<Int, Int> = HashMap()
for (item in input) {
if (newMap.containsKey(item)) {
//TODO: add 1 to value if key is found
}else {
newMap.put(item, 1)
}
}
return emptySet()
}
Run Code Online (Sandbox Code Playgroud)
如果密钥已存在,我无法找到将值加1的方法.
我试过这样做:
newMap[item] +=1
Run Code Online (Sandbox Code Playgroud)
但我得到一个关于plusAssign(1)的错误,不允许在Nullable接收器上.
kotlin ×10
android ×2
java ×2
builder ×1
collections ×1
dsl ×1
hashmap ×1
intervals ×1
java-8 ×1
java-stream ×1
jodatime ×1
kotlin-reified-type-parameters ×1
lambda ×1
receiver ×1