标签: kotlin-extension

我可以创建一个Kotlin扩展方法来将rxJava订阅添加到CompositeSubscription吗?

我一直在玩Kotlin/RxJava并尝试创建一个扩展方法来添加Subscriptiona CompositeSubscription,它的工作方式如下:

search.subscribe {
       //do stuff
}.addToComposite(compositeSubscription)
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的尝试:

fun Subscription.addToComposite(composite: CompositeSubscription) = { composite.add(this) }
Run Code Online (Sandbox Code Playgroud)

它编译和运行没有错误,但似乎并没有实际添加SubscriptionCompositeSubscription.难道我做错了什么?

kotlin rx-java rx-kotlin kotlin-extension

2
推荐指数
1
解决办法
483
查看次数

Kotlin函数不需要,但定义为其他类型

我已经定义了这样的课程

abstract class MvpViewHolder<P>(itemView: View) : RecyclerView.ViewHolder(itemView) where P : BasePresenter<out Any?, out Any?> {
    protected var presenter: P? = null

    fun bindPresenter(presenter: P): Unit {
        this.presenter = presenter
        presenter.bindView(itemView)
    }
}
Run Code Online (Sandbox Code Playgroud)

哪里presenter.bindView(itemView)给我一个错误说明Type mismatch, required: Nothing, found: View!。我已经像这样定义bindViewpresenter类的内部

abstract class BasePresenter<M, V> {
     var view: WeakReference<V>? = null
     var model: M? = null

     fun bindView(view: V) {
        this.view = WeakReference(view)
    }
}
Run Code Online (Sandbox Code Playgroud)

它的取值为view: V

我尝试定义BasePresenter<out Any?, out Any?>使用星型语法的扩展名, …

generics android kotlin kotlin-extension kotlin-android-extensions

2
推荐指数
1
解决办法
2936
查看次数

如何在Kotlin中解析下面的Json数据?

我需要解析此信息-

[
{
    "artist": "12",
    "image": "23"
},
{
    "video_id": "12",
    "video_title": "23"
},
{
    "video_id": "12",
    "video_title": "23"
},
{
    "video_id": "12",
    "video_title": "23"
},
{
    "video_id": "12",
    "video_title": "23"
},
{
    "video_id": "12",
    "video_title": "23"
}]
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个字段是不同的,如何在Kotlin中以不同的方式解析以下信息,并且如何以不同的方式解析第一个字段。

我将第一部分解析为-

response ->

                for (i in 0..(response.length() -1)){

                    /**
                        FIRST SONG
                     **/
                    val song = response.get(0).toString()

                    val listOfSongs = response.toString()

                    val parser = Parser()
                    val stringBuilder = StringBuilder(song)
                    val json: JsonObject = parser.parse(stringBuilder) as JsonObject
                    val firstArtist = json.string("artist")
                    val firstImage …
Run Code Online (Sandbox Code Playgroud)

kotlin android-volley rx-kotlin kotlin-extension kotlin-android-extensions

2
推荐指数
1
解决办法
3288
查看次数

Kotlin:从列表中的嵌套集中查找计数(更多功能方法)

下面的功能创建一个地图,获取乘客数量> minTrips的乘客数量.代码完全正常.请看下面

fun List<Trip>.filter(minTrips : Int): Set<Passenger> {
    var passengerMap: HashMap<Passenger, Int> = HashMap()

    this.forEach { it: Trip ->
        it.passengers.forEach { it: Passenger ->
            var count: Int? = passengerMap.get(it)
            if (count == null) {
                count = 1
                passengerMap.put(it, count)
            } else {
                count += 1
                passengerMap.put(it, count)
            }
        }
    }

    val filteredMinTrips: Map<Passenger, Int> = passengerMap.filterValues { it >= minTrips }
    println (" Filter Results = ${filteredMinTrips}")
    return filteredMinTrips.keys
}
Run Code Online (Sandbox Code Playgroud)

虽然这是用Kotlin编写的,但似乎代码最初是用Java编写的,然后转换为Kotlin.如果它真的是用Kotlin写的,我相信这不会是这么多行代码.如何减少代码行?解决这个问题的更有趣的方法是什么?我可以使用哪些功能或功能直接提取乘客设置> minTrips?这是一个太多的代码,似乎很疯狂.任何指针在这里都会有所帮助.

java kotlin kotlin-extension kotlin-android-extensions

2
推荐指数
1
解决办法
217
查看次数

kotlin GlobalScope,kotlin.coroutines中不提供runBlocking。*

我在这里的 github中有多模块kotlin gradle项目。

我的一个子项目的introducing-coroutines与构建文件build.gradle.kts的文件是在这里

的内容build.gradle.kts是-

    import org.jetbrains.kotlin.gradle.dsl.Coroutines
    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

    plugins {
        java
        kotlin("jvm") version "1.3.11"
    }

    group = "chapter2"
    version = "1.0-SNAPSHOT"

    repositories {
        mavenCentral()
    }

    dependencies {
        compile(kotlin("stdlib-jdk8"))
        compile(kotlin ("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0"))
        testCompile("junit", "junit", "4.12")
    }

    configure<JavaPluginConvention> {
        sourceCompatibility = JavaVersion.VERSION_1_8
    }


    tasks.withType<KotlinCompile> {
        kotlinOptions.jvmTarget = "1.8"
    }

    kotlin {
        experimental {
            coroutines   = Coroutines.ENABLE
        }
    }
Run Code Online (Sandbox Code Playgroud)

我正在尝试从此链接创建我的第一个协程程序。

import kotlinx.coroutines.*

fun main() {
    GlobalScope.launch { // launch new coroutine in background …
Run Code Online (Sandbox Code Playgroud)

coroutine kotlin kotlin-extension kotlinx.coroutines

2
推荐指数
1
解决办法
493
查看次数

如何在Java类上的Kotlin中声明扩展静态函数?

我想在kotlin中声明一个扩展函数,但是在Java类库上,当您companion在扩展函数中解析时,我知道在Kotlin中这样做。喜欢:

class Food {
   companion object {
       fun foo() = Unit
   }
}

fun Food.Companion.clear(){/*Clear all of objects*/}


Run Code Online (Sandbox Code Playgroud)

现在,有什么方法可以static在Java类库中注入函数吗?

java android static-functions kotlin kotlin-extension

2
推荐指数
1
解决办法
53
查看次数

扩展函数上的协程

我正在使用扩展函数将列表数据绑定到 recyclerview ,使用 pagedlist 它不需要任何协程

@BindingAdapter("pagedListAdapterData")
fun <T : Any> submitPagedList(recyclerView: RecyclerView, list: PagedList<T>?) {
    if (list != null && recyclerView.adapter is PagedListAdapter<*, *>) {
        (recyclerView.adapter as? PagedListAdapter<T, RecyclerView.ViewHolder>)?.submitList((list))
    }
}

        pagedListAdapterData="@{viewModel.list}"
Run Code Online (Sandbox Code Playgroud)

但随着我升级到 Paging 3.0,它需要使用协程

@BindingAdapter("pagingDataAdapter")
fun <T : Any> submitPagingDataList(recyclerView: RecyclerView, list: PagingData<T>?) {
    if (list != null && recyclerView.adapter is PagingDataAdapter<*, *>) {
        GlobalScope.launch {
            (recyclerView.adapter as? PagingDataAdapter<T, RecyclerView.ViewHolder>)?.submitData((list))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但我担心的是 Globalscope 的使用,似乎有更好的方法来做到这一点,因为不推荐 globalScope

android kotlin kotlin-extension android-paging kotlin-coroutines

2
推荐指数
1
解决办法
1380
查看次数

如何在Kotlin Android上正确使用URL

我想用

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val json = URL("https://my-api-url.com/something").readText()
    simpleTextView.setText(json)
}
Run Code Online (Sandbox Code Playgroud)

但是发生致命错误

FATAL EXCEPTION: main
    Process: com.mypackage.randompackage, PID: 812
    java.lang.RuntimeException: Unable to start activity ComponentInfo{ ***.MainActivity}: android.os.NetworkOnMainThreadException
Run Code Online (Sandbox Code Playgroud)

如何简单地从URL链接读取JSON?该async功能的软件包不存在。

android kotlin kotlin-extension kotlin-android-extensions

1
推荐指数
1
解决办法
3445
查看次数

使用Kotlin向左或向右滑动来捕获事件

如何使用Kotlin向左或向右滑动来捕获事件?

我已经实现了OnTouchListener来尝试捕获某些内容,但是什么也没有发生。

class MyClass : Fragment(), View.OnTouchListener {

        lateinit var mRootView: View

        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                                      savedInstanceState: Bundle?): View? {


                mRootView = inflater.inflate(myLayout, container, false)

                mRootView.setOnTouchListener(this)

                return mRootView
            }

        override fun onTouch(view: View?, event: MotionEvent?): Boolean {
                println("test")
                println(event?.actionMasked.toString())
                return true
         }
}
Run Code Online (Sandbox Code Playgroud)

android kotlin kotlin-extension kotlin-android-extensions

1
推荐指数
1
解决办法
2191
查看次数

从Kotlin中的值列表创建EnumMap

我想定义的扩展名,该扩展名enum class以与枚举常量相同的顺序接受值列表,并输出EnumMap

相反,我能够做的是使用作为输入List<V>的键数组创建和扩展对象Enum<K>.values()

看来困难enum class本身不是具有.values()方法的对象。因此,也许我的要求不明智。

这是一个使用列表扩展方法的工作示例。

import java.util.*

enum class Shoes(
    val title: String,
    val weight: Double) {
    WORKBOOT("tough", 11.0),
    SNEAKER("fast", 6.0),
    SLIPPER("soft", 3.0);
}

fun main(args: Array<String>) {
    val prices= listOf(11.5,8.2,3.5)
    val map = prices.enumMapOf(Shoes.values())
    map.print()
}

inline fun <reified K : Enum<K>, V> List<V>.enumMapOf(keys:Array<K>): EnumMap<K, V> {
    val map = EnumMap<K, V>(K::class.java)
    keys.forEachIndexed{i,k-> map[k]=this[i]}
    return map
}

fun <K:Enum<K>,V> EnumMap<K,V>.print() {
    this.forEach{k,v-> println("%d: %s --> %.2f".format(k.ordinal,k.name,v)) …
Run Code Online (Sandbox Code Playgroud)

enum-map kotlin kotlin-extension

1
推荐指数
2
解决办法
2061
查看次数