我一直在摆弄Kotlin data classes,我正在考虑是否可以增加一些类(其中包含copy例如的功能)以增加所有data classes?
是否可以增加data classes?
我正在使用Retrofit来调用API并使用converter-gson将响应json转换为kotlin
这是回应
{
"id": "1",
"rank": "1",
"name": "Challenge",
"status": "E",
"createDate": "2018-09-17 15:01:28",
"lastModDate": "2018-09-17 15:06:32",
"category": "DINING",
"photo": {
"path": "http://example.com/xxx.jpg",
"size": [
400,
267
]
}
}
Run Code Online (Sandbox Code Playgroud)
这是数据类.
data class ServiceList (val id:Int,
val rank:Int,
val name:String,
val status:String,
val lastModDate:String,
val category:String,
???????)
Run Code Online (Sandbox Code Playgroud)
如何完成这门课程?
我尝试为我的一些数据类创建一个自定义的 toString() 方法。但我只想定义 fun toString 的覆盖一次。
这将是我的超级班:
abstract class Id(val value: String) {
override fun toString(): String {
return value
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想通过扩展超类 Id 在我的一些数据类中使用自定义的 toString() 方法:
data class MyId(val v: String): Id(v)
Run Code Online (Sandbox Code Playgroud)
但是,这会在 MyId 中为“v”引入辅助字段和 getter,这不是我想要的。使用“value”而不是“v”给我带来了问题:“value”隐藏了超类型“Id”的成员。我想重用 Id 中定义的“值”字段和 getter。我不想介绍一个新的。
我该如何纠正?
我有一个后端,它总是会返回带有一些数据的“成功”,因为在 json 字段中,字段将被命名为成功并在其中包含数据。或者它会以 json 格式返回一个错误对象。所以我想要某种 BaseResponse,所以当我使用它时,我可以做一些类似 BaseResponse 的事情,这样成功就会被映射为一个 Person 对象。
所以我想这样做:
@Parcelize
data class BaseResponse<T>(
val success: T? = null
) : Parcelable
Run Code Online (Sandbox Code Playgroud)
但它说 Parcelize 不直接支持 Type。有什么办法可以做到这一点吗?还是我需要写一些自定义的东西?使用 Retrofit 和 Gson 作为序列化程序调用调用等。
我有一个清单
val shoeCart = ShoeRepository.getShoeFromCart(this@ActivityCart)
Run Code Online (Sandbox Code Playgroud)
来自鞋库
fun getShoeFromCart(context: Context): List<ShoeModel> {
return getCart(context)
}
Run Code Online (Sandbox Code Playgroud)
ShoeModel 是一个数据类
data class ShoeModel
Run Code Online (Sandbox Code Playgroud)
我想知道我的 ShoesCart 中是否有重复的条目,如果有,有多少?
我sendData从发送StartActivity到ResultActivity。
val sendData = SendData(10, "xyz", "yss")
sendData.e = 933
sendData.f = "hello"
sendData.g = 39
// Log.d("A", "${sendData.toString}")
val intent = Intent(this@StartActivity, ResultActivity::class.java)
intent.putExtra(RESULT_DATA, sendData)
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)
sendData = intent.extras!!.getParcelable(RESULT_DATA)
// Log.d("B", "${sendData.toString}")
Run Code Online (Sandbox Code Playgroud)
模型类看起来像这样。
@Parcelize
data class SendData(var a: Int, var b: String, var c: String) : Parcelable {
var e: Int? = null
var f: String? = null
var g: Int? = null
var isClicked = false
override fun toString(): String{
return JsonUtil.toJson(this) …Run Code Online (Sandbox Code Playgroud) 我正在学习数据类,但我对 sort_index 的目的及其实际工作原理感到困惑。
我似乎找不到任何有价值的信息。Python 官方文档没有提及这一点,这令人难以置信。
这是一个例子:
@dataclass(order=True)
class Person:
sort_index: int = field(init=False, repr=False)
name: str
age: int
weight: int = 190
def __post_init__(self):
self.sort_index = self.weight
Run Code Online (Sandbox Code Playgroud)
那么,sort_index的目的是什么?它是干什么用的?我什么时候使用它?
再次感谢您花时间回答我的问题。我是Python新手。
我是 Kotlin 的新手,我正在尝试理解它,我刚刚编写了一个简单的示例,该示例展示了如何将数据类与映射一起使用有点棘手,因为在我看来,数据类有一种奇怪的行为。默认情况下,他们根据类的每个属性定义 hashCode()。但他们没有定义默认的 equals() 方法。这给我带来了很多困惑,因为我创建了一个以数据类作为键的 HashMap,但我没有重写 hashCode() 和 equals()。我的数据类有一个 MutableList 成员。当我将一个元素放入映射中时,只要我没有将元素添加到 MutableList 中,我就会使用 map.get(dataObject) 检索它。之后,即使数据对象仍然相同,并且我使用map.keys(map.keys.indexOf(dataObject)有效)发现它,由于hashCode(),map.get(dataObject)失败了。
我可以使用普通类或添加 hashCode() 和 equals() 来修复它,从 hashCode() 中删除 MutableList,但我想知道,由于默认行为,重写 hashCode() 和 equals() 是否应该是“强制”与数据类一起使用,否则将它们与地图一起使用可能会导致错误。
我还能做些什么来避免这个问题吗?
package cards
data class Player(val name: String, var cards: MutableList<Card>) {
constructor(name: String): this(name, mutableListOf())
//I don't need to define equals, so pointers are checked. But if I don't override hashCode, as it's based
//on every property, the hashCode is calculated considering the content of the MutableList!
// override …Run Code Online (Sandbox Code Playgroud) 我有一份清单Lessons。这是我的Lessons课程:
data class Lessons(
val id: Long,
val name: String,
val time: Long,
val key: String
)
Run Code Online (Sandbox Code Playgroud)
我需要将元素移动到列表的开头,其key字段的值为“priority”。这是我的代码:
val priorityLesson = lessons.find { it.key == "priority" }
if (priorityLesson != null) {
lessons.remove(priorityLesson)
lessons.add(0, priorityLesson)
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但我不喜欢这个解决方案,也许有一种更有效的方法来执行这个算法。此外,我需要将列表转换为可变的,并且我想将其保留为不可变的。
请帮我。
我尝试以下代码时遇到java.lang.StackOverflowError错误:堆栈大小8MB,应用程序恰好崩溃了1次,现在又不再崩溃了,我想知道这是否会引起任何问题提交此代码之前的未来
以下是本部分中使用的接口/数据类的示例
interface y{
val image
}
data class x(val anotherImage): y{
override val image
get() = image ?: anotherImage
}
Run Code Online (Sandbox Code Playgroud)
我在这里想要的是让val图像包含图像的URL,有时后端在图像中返回它,而在其他时候在anotherImage中返回它,这就是为什么我写了这段代码,这里使用接口是为了与这个问题无关的问题
data-class ×10
kotlin ×9
android ×2
parcelable ×2
algorithm ×1
arraylist ×1
collections ×1
generics ×1
hashcode ×1
hashmap ×1
json ×1
list ×1
model ×1
mutablelist ×1
oop ×1
overriding ×1
properties ×1
python ×1
python-3.x ×1