수색…
DTO 만들기 (POJO / POCO)
kotlin의 데이터 클래스는 데이터를 보유하기 만하면되는 클래스입니다. 이러한 클래스는 data
로 표시됩니다.
data class User(var firstname: String, var lastname: String, var age: Int)
위의 코드는 다음과 같이 자동 생성 된 User
클래스를 만듭니다.
- 모든 프로퍼티의 getter와 setter (
val
의 getter 만) -
equals()
-
hashcode()
-
toString()
-
copy()
-
componentN()
(N
은 선언 된 순서대로 해당 속성 임)
함수와 마찬가지로 기본값도 지정할 수 있습니다.
data class User(var firstname: String = "Joe", var lastname: String = "Bloggs", var age: Int = 20)
자세한 내용은 여기 데이터 클래스를 참조하십시오 .
목록 필터링
val list = listOf(1,2,3,4,5,6)
//filter out even numbers
val even = list.filter { it % 2 == 0 }
println(even) //returns [2,4]
public 생성자에 클래스를 제공하지 않고 클래스에 위임합니다.
클래스 에 위임 하려고하지만 생성자 매개 변수에 위임 클래스를 제공하지 않으려한다고 가정합니다. 대신 생성자 호출자가 알지 못하게 private하게 구성하려고합니다. 클래스 위임이 생성자 매개 변수에만 위임 할 수 있으므로 처음에는 불가능한 것처럼 보일 수 있습니다. 그러나, 이 대답 에서 주어진대로 그것을 할 수있는 방법 이 있습니다 :
class MyTable private constructor(table: Table<Int, Int, Int>) : Table<Int, Int, Int> by table {
constructor() : this(TreeBasedTable.create()) // or a different type of table if desired
}
이것으로 MyTable
의 생성자를 MyTable()
과 같이 호출 할 수 있습니다. MyTable
위임 한 Table<Int, Int, Int>
은 비공개로 만들어집니다. 생성자 호출자는 그것에 대해 아무것도 모릅니다.
이 예제는 이 SO 질문 에 기초합니다.
Kotlin의 Serializable 및 serialVersionUid
Kotlin에서 클래스의 serialVersionUID
를 만들려면 클래스의 컴패니언 개체에 멤버를 추가하는 것과 관련된 몇 가지 옵션이 있습니다.
가장 간결한 바이트 코드 는 포함하는 클래스 (이 경우 MySpecialCase
에서 개인 정적 변수가 될 private const val
에서 MySpecialCase
.
class MySpecialCase : Serializable {
companion object {
private const val serialVersionUID: Long = 123
}
}
또한 직렬화에 필요하지 않은 getter / setter 메소드가있는 부작용 이있는이 양식을 사용할 수 있습니다.
class MySpecialCase : Serializable {
companion object {
private val serialVersionUID: Long = 123
}
}
이것에 의해 정적 필드가 작성됩니다 만, getSerialVersionUID
는 컴패니언 오브젝트에 불필요합니다.
class MySpecialCase : Serializable {
companion object {
@JvmStatic private val serialVersionUID: Long = 123
}
}
이것에 의해 정적 필드가 작성됩니다 만, getSerialVersionUID
는 포함하는 클래스 MySpecialCase
에 정적 getter가 작성되어 불필요합니다.
하지만 모두 serialVersionUID
를 Serializable
클래스에 추가하는 방법으로 작동합니다.
Kotlin의 유창한 방법
Kotlin의 유창한 메소드는 Java와 동일 할 수 있습니다.
fun doSomething() {
someOtherAction()
return this
}
그러나 다음과 같은 확장 기능을 만들어 더 기능적으로 만들 수도 있습니다.
fun <T: Any> T.fluently(func: ()->Unit): T {
func()
return this
}
그러면 더 명확하게 유창한 기능을 사용할 수 있습니다.
fun doSomething() {
return fluently { someOtherAction() }
}
let을 사용하거나 nullable 객체 작업을 단순화하십시오.
let
코 틀린에하는 것은에 호출 된 객체로부터 바인딩 지역 만듭니다. 예:
val str = "foo"
str.let {
println(it) // it
}
그러면 "foo"
가 인쇄되고 Unit
을 반환합니다.
차이 let
및 also
당신이에서 어떤 값을 반환 할 수 있다는 것입니다 let
블록. also
다른 한편으로는 항상 Unit
reutrn 것입니다.
이제 이것이 왜 유용한 지 묻습니다. 당신 때문에 반환 할 수있는 방법을 호출하는 경우 null
그 반환 값이없는 경우에만 몇 가지 코드를 실행하려면 null
사용할 수 let
나 also
이 같은 :
val str: String? = someFun()
str?.let {
println(it)
}
이 코드는 str
이 null
이 아닌 경우에만 let
블록을 실행합니다. null
안전 연산자 ( ?
)에 유의하십시오.
적용을 사용하여 객체를 초기화하거나 메소드 체인을 달성합니다.
문서는 apply
다음과 같이 말한다 :
로 지정된 함수 블록 호출
this
리시버와 같은 값을 리턴this
값입니다.
kdoc 그렇게 도움이되지 않습니다 동안 apply
정말로 유용한 기능입니다. 쉽게 설명하자면이에 apply
있는 범위 설정 this
당신이 호출 된 객체에 바인딩 apply
에 있습니다. 이렇게하면 나중에 객체를 반환 할 때 여러 메소드를 호출해야 할 때 일부 코드를 사용할 수 있습니다. 예:
File(dir).apply { mkdirs() }
이것은 다음과 같이 쓰는 것과 같습니다 :
fun makeDir(String path): File {
val result = new File(path)
result.mkdirs()
return result
}