我一直在玩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)
它编译和运行没有错误,但似乎并没有实际添加Subscription到CompositeSubscription.难道我做错了什么?
我已经定义了这样的课程
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!。我已经像这样定义bindView了presenter类的内部
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
我需要解析此信息-
[
{
"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
下面的功能创建一个地图,获取乘客数量> 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?这是一个太多的代码,似乎很疯狂.任何指针在这里都会有所帮助.
我在这里的 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) 我想在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类库中注入函数吗?
我正在使用扩展函数将列表数据绑定到 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
我想用
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功能的软件包不存在。
如何使用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) 我想定义的扩展名,该扩展名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)