+Christina Lee @RunChristinaRun +Jake Wharton @JakeWharton Kotlin is here Life is great and everything will be OK
A presentation at Google I/O in May 2017 in Mountain View, CA, USA by Jake Wharton
 
                +Christina Lee @RunChristinaRun +Jake Wharton @JakeWharton Kotlin is here Life is great and everything will be OK
 
                MainActivity.java public class MainActivity extends
Activity {
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
} 1
} 2
 
                MainActivity.java public class MainActivity extends
Activity {
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
} 1
} 2
 
                MainActivity.java public class MainActivity extends
Activity {
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
} 1
} 2
 
                MainActivity.java public class MainActivity extends
Activity {
@Override
protected void onCreate (@Nullable Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
} 1
} 2
@Nullable
 
                MainActivity.java public class MainActivity extends
Activity {
@Override
protected void onCreate (@Nullable Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
} 1
} 2
 
                MainActivity.kt class MainActivity :
Activity () {
override fun onCreate ( savedInstanceState: Bundle ? ) {
super . onCreate ( savedInstanceState ) } 1
} 2
 
                MainActivity.kt class MainActivity :
Activity () {
override fun onCreate ( savedInstanceState: Bundle ? ) {
super . onCreate ( savedInstanceState ) } 1
} 2
 
                MainActivity.kt class MainActivity :
Activity () {
override fun onCreate ( savedInstanceState: Bundle ? ) {
super . onCreate ( savedInstanceState ) } 1
} 2
 
                TextView.java public float getAlpha () {
// Retrieve value...
}
 
                TextView.java public float getAlpha () {
// Retrieve value...
}
public void setAlpha ( float alpha ) {
// Set value...
}
 
                TextView.java public float getAlpha () {
// Retrieve value...
}
public void setAlpha ( float alpha ) {
// Set value...
// ...
Log . d ( "MainActivity" ,
"Alpha: "
tv . getAlpha ());
tv . setAlpha ( 0f ); MainActivity.java
 
                TextView.java public float getAlpha () {
// Retrieve value...
}
public void setAlpha ( float alpha ) {
// Set value...
// ...
Log . d ( "MainActivity" ,
"Alpha: "
tv . alpha )
0f
 
                TextView.java public float getAlpha () {
// Retrieve value...
} 1
public void setAlpha ( float alpha ) {
// Set value...
} 2
// ...
Log . d ( "MainActivity" ,
"Alpha: "
tv . alpha )
0f
 
                TextView.java public float getAlpha () {
// Retrieve value...
} 1
public void setAlpha ( float alpha ) {
// Set value...
} 2
// ...
Log . d ( "MainActivity" ,
"Alpha: "
tv . alpha )
0f
 
                TextView.java public float getAlpha () {
// Retrieve value...
} 1
public void setAlpha ( float alpha ) {
// Set value...
} 2
// ...
Log . d ( "MainActivity" ,
"Alpha: "
tv . alpha )
0f
 
                MainActivity.java LinearLayout views
= // ...
for ( int i = 0 ; i < views . getChildCount ();
i ++ ) {
View view
= views . getChildAt ( i ); // TODO do something with view
}
 
                MainActivity.kt val views = // ... for ( index in 0 until views . childCount ) {
views . getChildAt ( index )
// TODO do something with view
}
 
                MainActivity.kt val views = // ... for ( index in 0 until views . childCount ) {
views . getChildAt ( index )
// TODO do something with view
} 1
 
                MainActivity.kt val views = // ... for ( index in 0 until views . childCount ) {
views . getChildAt ( index )
// TODO do something with view
} 1
 
                MainActivity.kt val views = // ... for ( index in 0 until views . childCount ) {
views . getChildAt ( index )
// TODO do something with view
}
 
                MainActivity.kt val views = // ... for ( index in 0 until views . childCount ) { Z
views . getChildAt ( index )
// TODO do something with view
} 1 ViewGroups.kt fun ViewGroup . forEach ( action: ( View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( getChildAt ( index )) } 2
}
3
.
Each
->
 
                MainActivity.kt val views = // ... views . forEach { Z view
->
// TODO do something with view
} 1
ViewGroups.kt fun ViewGroup . forEach ( action: ( View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( getChildAt ( index )) } 2
} 3 val = views.getChildAt(i)
 
                MainActivity.kt val views = // ... views . forEach { Z view
->
// TODO do something with view
} 1
ViewGroups.kt fun ViewGroup . forEach ( action: ( View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( getChildAt ( index )) } 2
} 3
 
                MainActivity.kt val views = // ... views . forEach { Z view
->
// TODO do something with view
} 1
ViewGroups.kt fun ViewGroup . forEach ( action: ( View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( getChildAt ( index )) } 2
} 3
 
                MainActivity.kt val views = // ... views . forEach { Z view
->
// TODO do something with view
} 1
ViewGroups.kt fun ViewGroup . forEach ( action: ( View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( getChildAt ( index )) } 2
} 3
 
                MainActivity.kt val views = // ... views . forEach { Z view
->
// TODO do something with view
} 1
ViewGroups.kt fun ViewGroup . forEach ( action: ( View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( getChildAt ( index )) } 2
} 3
 
                MainActivity.kt val views = // ... views . forEach { Z view
->
// TODO do something with view
} 1
ViewGroups.kt inline fun ViewGroup . forEach ( action: ( View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( getChildAt ( index )) } 2
} 3 inline
 
                MainActivity.kt val views = // ... views . forEach { Z view
->
// TODO do something with view
} 1
ViewGroups.kt inline fun ViewGroup . forEach ( action: ( View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( getChildAt ( index )) } 2
} 3
 
                MainActivity.kt val views = // ... views . forEach { Z view
-> /* ... */ } 1 views . forEachIndexed {
index , view
-> /* ... */ } 1
ViewGroups.kt inline fun ViewGroup . forEach ( action: ( View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( getChildAt ( index )) } 2
} 3 inline fun ViewGroup . forEachIndexed ( action: ( Int , View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( index , getChildAt ( index )) } } // TODO do something with view
 
                MainActivity.kt val views = // ... views . forEach { Z view
-> /* ... */ } 1 views . forEachIndexed {
index , view
-> /* ... */ } 1
ViewGroups.kt inline fun ViewGroup . forEach ( action: ( View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( getChildAt ( index )) } 2
} 3 inline fun ViewGroup . forEachIndexed ( action: ( Int , View ) -> Unit ) {
for ( index in 0 until childCount ) {
action ( index , getChildAt ( index )) } } // TODO do something with view
 
                getChildAt ( index )
 
                MainActivity.kt val views = // ...
views [ 0 ]
getChildAt ( index ) // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ]
getChildAt ( index ) // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ]
getChildAt ( index ) // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= first
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child ) // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= first
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child ) // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= first views += first
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child ) // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= first views += first
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child ) // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= first views += first if ( first in views ) doSomething ()
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1 // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= first views += first if ( first in views ) doSomething ()
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1 // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= first views += first if ( first in views ) doSomething ()
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1 // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= first views += first if ( first in views ) doSomething ()
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1 // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething ()
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1 // TODO do something with view
 
                MainActivity.kt val views = // ...
views.get ( 0 ) views . minusAssign ( first )
views . plusAssign ( first )
if ( views . contains ( first )) doSomething ()
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1 // TODO do something with view
   in
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething ()
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1 // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething () Log . d ( "MainActivity" , "View count: ${ views . size } " )
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1
val ViewGroup . size : Int
get () = childCount // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething () Log . d ( "MainActivity" , "View count: ${ views . size } " )
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1
val ViewGroup . size : Int
get () = childCount // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething () Log . d ( "MainActivity" , "View count: ${ views . size } " )
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1
val ViewGroup . size : Int
get () = childCount // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething () Log . d ( "MainActivity" , "View count: ${ views . size } " )
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1
val ViewGroup . size : Int
get () = childCount // TODO do something with view
 
                MainActivity.kt val views = // ...
views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething () Log . d ( "MainActivity" , "View count: ${ views . size } " )
getChildAt ( index )
operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child )
operator fun ViewGroup . plusAssign ( child: View ) = addView ( child )
operator fun ViewGroup . contains ( child: View ) = indexOfChild ( child ) != - 1
val ViewGroup . size : Int
get () = childCount // TODO do something with view
 
                MainActivity.kt val views = // ... // TODO do something with view ViewGroups.kt fun ViewGroup . children () = object : Iterable < View
{
override fun iterator () = object : Iterator < View
{
var index
= 0
override fun hasNext () = index
< childCount
override fun next () = getChildAt ( index ++) } }
 
                MainActivity.kt val views = // ...
for ( view
in views . children ()) { // TODO do something with view
} 1
ViewGroups.kt fun ViewGroup . children () = object : Iterable < View
{
override fun iterator () = object : Iterator < View
{
var index
= 0
override fun hasNext () = index
< childCount
override fun next () = getChildAt ( index ++) } 2
} 3 // TODO do something with view
 
                MainActivity.kt val views = // ...
for ( view
in views . children ()) { // TODO do something with view
} 1
View . VISIBLE
}
. sumBy { it . measuredHeight }
ViewGroups.kt fun ViewGroup . children () = object : Iterable < View
{
override fun iterator () = object : Iterator < View
{
var index
= 0
override fun hasNext () = index
< childCount
override fun next () = getChildAt ( index ++) } 2
} 3 // TODO do something with view
 
                MainActivity.kt val views = // ...
for ( view
in views . children ()) { // TODO do something with view
}
View . VISIBLE
}
. sumBy { it . measuredHeight }
ViewGroups.kt fun ViewGroup . children () = object : Iterable < View
{
override fun iterator () = object : Iterator < View
{
var index
= 0
override fun hasNext () = index
< childCount
override fun next () = getChildAt ( index ++) } } // TODO do something with view
 
                MainActivity.java Trace . beginSection ( sectionName );
expensiveCalculation ();
Trace . endSection () ;
 
                MainActivity.java Trace . beginSection ( sectionName );
expensiveCalculation ();
Trace . endSection () ; Traces.kt inline fun
trace ( sectionName: String , body: () -> Unit )
{
Trace . beginSection ( sectionName )
try {
body () } 2 finally {
Trace . endSection () } 3
} 4
 
                Traces.kt inline fun
trace ( sectionName: String , body: () -> Unit )
{ Z
Trace . beginSection ( sectionName )
try {
body () } 2 finally {
Trace . endSection () } 3
} 4 MainActivity.kt trace ( "foo" ) {
expensiveCalculation () } 1
 
                Traces.kt inline fun < T
trace ( sectionName: String , body: () -> T ) :
T
{ Z
Trace . beginSection ( sectionName )
try {
return body () } 2 finally {
Trace . endSection () } 3
} 4
Unit MainActivity.kt trace ( "foo" ) {
expensiveCalculation () } 1
< T
T
T
return
 
                Traces.kt inline fun < T
trace ( sectionName: String , body: () -> T ) :
T
{ Z
Trace . beginSection ( sectionName )
try {
return body () } 2 finally {
Trace . endSection () } 3
trace ( "foo" ) {
< T
T
T
return
 
                Traces.kt inline fun < T
trace ( sectionName: String , body: () -> T ) :
T
{ Z
Trace . beginSection ( sectionName )
try {
return body () } 2 finally {
Trace . endSection () } 3
trace ( "foo" ) {
expensiveCalculation () } 1
 
                MainActivity.java SQLiteDatabase db = // ... db . beginTransaction (); try {
db . delete ( "users" ,
"first_name = ?" ,
new
String [] { "jake" }); } finally {
db . endTransaction (); } 1
 
                MainActivity.java SQLiteDatabase db = // ... db . beginTransaction (); try {
db . delete ( "users" ,
"first_name = ?" ,
new
String [] { "jake" });
db . setTransactionSuccessful (); } finally {
db . endTransaction (); } 1
 
                SQLiteDatabase db = // ... db . beginTransaction (); try {
db . delete ( "users" ,
"first_name = ?" ,
new
String [] { "jake" });
db . setTransactionSuccessful (); } finally {
db . endTransaction (); } 1 Databases .kt inline fun SQLiteDatabase . transaction ( body: () -> Unit ) {
beginTransaction ()
try {
body ()
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1
 
                MainActivity.kt val db = // ... db . transaction
{ 4
db . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: () -> Unit ) {
beginTransaction ()
try {
body () X
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1 SQLiteDatabase
db.beginTransaction(); try new String[] { } db.setTransactionSuccessful(); finally { db.endTransaction(); }1
 
                MainActivity.kt val db = // ... db . transaction
{ 4
db . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: () -> Unit ) {
beginTransaction ()
try {
body () X
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
 
                MainActivity.kt val db = // ... db . transaction
{ 4
db . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: () -> Unit ) {
beginTransaction ()
try {
body () X
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
 
                MainActivity.kt val db = // ... db . transaction
{ 4
db . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: ( SQLiteDatabase ) -> Unit ) {
beginTransaction ()
try {
body () X
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
SQLiteDatabase
 
                MainActivity.kt val db = // ... db . transaction
{ 4
db . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: ( SQLiteDatabase ) -> Unit ) {
beginTransaction ()
try {
body ( this ) X
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
SQLiteDatabase
body ( this ) X
 
                MainActivity.kt val db = // ... db . transaction
{ 4
it . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: ( SQLiteDatabase ) -> Unit ) {
beginTransaction ()
try {
body ( this )
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
it . delete
SQLiteDatabase
body ( this ) X
 
                MainActivity.kt val db = // ... db . transaction
{ 4
it . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: ( SQLiteDatabase ) -> Unit ) {
beginTransaction ()
try {
body ( this ) F
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
 
                MainActivity.kt val db = // ... db . transaction
{ 4
it . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: ( SQLiteDatabase ) -> Unit ) {
beginTransaction ()
try {
body ( this ) F
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
 
                MainActivity.kt val db = // ... db . transaction
{ 4
it . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: ( SQLiteDatabase ) -> Unit ) {
beginTransaction ()
try {
body ( this ) F
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
 
                MainActivity.kt val db = // ... db . transaction
{ 4
it . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: SQLiteDatabase .() -> Unit ) {
beginTransaction ()
try {
body ( this ) F
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
SQLiteDatabase .() -> Unit
 
                MainActivity.kt val db = // ... db . transaction
{ 4
it . delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: SQLiteDatabase .() -> Unit ) {
beginTransaction ()
try {
body ()
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
SQLiteDatabase .() -> Unit
body
() F
 
                it. MainActivity.kt val db = // ... db . transaction
{ 4
delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" ) ) } 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: SQLiteDatabase .() -> Unit ) {
beginTransaction ()
try {
body ()
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1 delete
SQLiteDatabase .() -> Unit
body
() F
 
                MainActivity.kt val db = // ... db . transaction
{ 4
delete ( "users" ,
"first_name = ?" , arrayOf ( "jake" )) G
} 3
Databases .kt inline fun SQLiteDatabase . transaction ( body: SQLiteDatabase .() -> Unit ) {
beginTransaction ()
try {
body ()
setTransactionSuccessful () } finally {
endTransaction () } 2
} 1 1
 
                MainActivity.kt = // ... "jake" Databases.kt inline fun SQLiteDatabase.transaction(body: SQLiteDatabase.() -> Unit) { beginTransaction() try { body() setTransactionSuccessful() } finally { endTransaction() }2
}1 1 class UserPersistence ( private val db: SQLiteDatabase ) {
fun deleteByFirstName ( name: String ) {
db . transaction {
delete ( "users" , "first_name = ?" , arrayOf ( name )) G
} 3
} } UserPersistence.kt
 
                MainActivity.kt = // ... "jake" Databases.kt inline fun SQLiteDatabase.transaction(body: SQLiteDatabase.() -> Unit) { beginTransaction() try { body() setTransactionSuccessful() } finally { endTransaction() }2
}1 1 class UserPersistence ( private val db: SQLiteDatabase ) {
fun deleteByFirstName ( name: String ) {
db . transaction {
delete ( "users" , "first_name = ?" , arrayOf ( name )) G
} 3
} } UserPersistence.kt
 
                class UserPersistence ( private val db: SQLiteDatabase ) {
fun deleteByFirstName ( name: String ) {
db . transaction {
delete ( "users" , "first_name = ?" , arrayOf ( name )) G
} 3
} 2
} 1 UserPersistence.kt
 
                class UserPersistence ( private val db: SQLiteDatabase ) {
private val
db . compileStatement (
"DELETE FROM users WHERE first_name = ?" )
fun deleteByFirstName ( name: String ) {
db . transaction {
deleteByFirstName . bindString ( 1 , name )
deleteByFirstName . execute ()
} 3
} 2
} 1 UserPersistence.kt
delete(" ", " , arrayOf ( ))G
 
                sssssssssssss class UserPersistence ( private val db: SQLiteDatabase ) {
private val
db . compileStatement (
"DELETE FROM users WHERE first_name = ?" )
fun deleteByFirstName ( name: String ) {
db . transaction {
deleteByFirstName . bindString ( 1 , name )
deleteByFirstName . execute ()
} 3
} 2
} 1 UserPersistence.kt
 
                sssssssssssss class UserPersistence ( private val db: SQLiteDatabase ) {
private val deleteByFirstName
by lazy {
db . compileStatement ( "DELETE FROM users WHERE first_name = ?" ) }
fun deleteByFirstName ( name: String ) {
db . transaction {
deleteByFirstName . bindString ( 1 , name )
deleteByFirstName . execute ()
} 3
} 2
} 1 UserPersistence.kt
 
                sssssssssssss class UserPersistence ( private val db: SQLiteDatabase ) {
private val deleteByFirstName
by lazy {
db . compileStatement ( "DELETE FROM users WHERE first_name = ?" ) } X
fun deleteByFirstName ( name: String ) {
db . transaction {
deleteByFirstName . bindString ( 1 , name )
deleteByFirstName . execute ()
} 3
} 2
} 1 UserPersistence.kt
 
                private val deleteByFirstName
by lazy {
db . compileStatement ( "DELETE FROM users WHERE first_name = ?" ) } X
 
                private val deleteByFirstName
by lazy {
db . compileStatement ( "DELETE FROM users WHERE first_name = ?" ) } X private val name
by Delegates . observable ( "jane" ) { old , new , prop ->
println ( "Name changed from $ old to $ new " ) }
 
                private val deleteByFirstName
by lazy {
db . compileStatement ( "DELETE FROM users WHERE first_name = ?" ) } X private val name
by Delegates . observable ( "jane" ) { old , new , prop ->
println ( "Name changed from $ old to $ new " ) }
private val address
by Delegates . notNull < String
()
 
                private val deleteByFirstName
by lazy {
db . compileStatement ( "DELETE FROM users WHERE first_name = ?" ) } X private val name
by Delegates . observable ( "jane" ) { old , new , prop ->
println ( "Name changed from $ old to $ new " ) }
private val address
by Delegates . notNull < String
()
private val nameView
by bindView < TextView
( R . id . name )
 
                private val deleteByFirstName
by lazy {
db . compileStatement ( "DELETE FROM users WHERE first_name = ?" ) } X private val name
by Delegates . observable ( "jane" ) { old , new , prop ->
println ( "Name changed from $ old to $ new " ) }
private val address
by Delegates . notNull < String
()
private val nameView
by bindView < TextView
( R . id . name )
 
                class MyListener : TransitionListener {
override fun onTransitionEnd ( transition: Transition ) { }
override fun onTransitionResume ( transition: Transition ) { }
override fun onTransitionPause ( transition: Transition ) { }
override fun onTransitionCancel ( transition: Transition ) { }
override fun onTransitionStart ( transition: Transition ) { } Y
} X
 
                class MyListener : TransitionListener {
override fun onTransitionStart ( transition: Transition ) { } Y
} X
 
                class MyListener : TransitionListener {
override fun onTransitionStart ( transition: Transition ) { } Y
} X
object EmptyTransitionListener : TransitionListener {
override fun onTransitionEnd ( transition: Transition ) {}
override fun onTransitionResume ( transition: Transition ) {}
override fun onTransitionPause ( transition: Transition ) {}
override fun onTransitionCancel ( transition: Transition ) {}
override fun onTransitionStart ( transition: Transition ) {} }
 
                class MyListener : TransitionListener {
override fun onTransitionStart ( transition: Transition ) { } Y
} X
object EmptyTransitionListener : TransitionListener {
override fun onTransitionEnd ( transition: Transition ) {}
override fun onTransitionResume ( transition: Transition ) {}
override fun onTransitionPause ( transition: Transition ) {}
override fun onTransitionCancel ( transition: Transition ) {}
override fun onTransitionStart ( transition: Transition ) {} }
 
                class MyListener : TransitionListener { T
override fun onTransitionStart ( transition: Transition ) { } Y
} X
object EmptyTransitionListener : TransitionListener {
override fun onTransitionEnd ( transition: Transition ) {}
override fun onTransitionResume ( transition: Transition ) {}
override fun onTransitionPause ( transition: Transition ) {}
override fun onTransitionCancel ( transition: Transition ) {}
override fun onTransitionStart ( transition: Transition ) {} } G
 
                class MyListener : TransitionListener by EmptyTransitionListener { T
override fun onTransitionStart ( transition: Transition ) { } Y
} X
object EmptyTransitionListener : TransitionListener {
override fun onTransitionEnd ( transition: Transition ) {}
override fun onTransitionResume ( transition: Transition ) {}
override fun onTransitionPause ( transition: Transition ) {}
override fun onTransitionCancel ( transition: Transition ) {}
override fun onTransitionStart ( transition: Transition ) {} } G
 
                class MyListener : TransitionListener by EmptyTransitionListener { T
override fun onTransitionStart ( transition: Transition ) { } Y
} X
object EmptyTransitionListener : TransitionListener {
override fun onTransitionEnd ( transition: Transition ) {}
override fun onTransitionResume ( transition: Transition ) {}
override fun onTransitionPause ( transition: Transition ) {}
override fun onTransitionCancel ( transition: Transition ) {}
override fun onTransitionStart ( transition: Transition ) {} } G
 
                class PaymentRobot {
fun amount ( value: Long ) { // TODO Espresso interactions
}
fun recipient ( value: String ) { // TODO Espresso interactions
}
fun send () { // TODO Espresso interactions
} } PaymentRobot.kt
 
                @Test
fun sendMoney () {
PaymentRobot (). apply {
amount ( 4_00 )
recipient ( "foo@example.com" )
send ()
} } PaymentTest.kt
 
                class PaymentRobot {
fun amount ( value: Long ) { // TODO Espresso interactions
}
fun recipient ( value: String ) { // TODO Espresso interactions
}
fun send () { // TODO Espresso interactions
} }
PaymentRobot.kt
 
                class PaymentRobot {
fun amount ( value: Long ) { // TODO Espresso interactions
}
fun recipient ( value: String ) { // TODO Espresso interactions
}
fun send () { // TODO Espresso interactions
} }
PaymentRobot.kt fun payment ( body: PaymentRobot .() -> Unit ) = PaymentRobot (). apply ( body )
 
                class PaymentRobot {
fun amount ( value: Long ) { // TODO Espresso interactions
}
fun recipient ( value: String ) { // TODO Espresso interactions
}
fun send () { // TODO Espresso interactions
} }
PaymentRobot.kt fun payment ( body: PaymentRobot .() -> Unit ) = PaymentRobot (). apply ( body )
 
                @Test
fun sendMoney () {
PaymentRobot (). apply { T
amount ( 4_00 )
recipient ( "foo@example.com" )
send ()
} T
} G
PaymentTest.kt
p
 
                @Test
fun sendMoney () {
payment { T
amount ( 4_00 )
recipient ( "foo@example.com" )
send ()
} T
} G
PaymentTest.kt
 
                sealed class Payloads { } G
 
                sealed class Payloads {
data class Favorite ( val favorited: Boolean ) : Payloads () } G
 
                sealed class Payloads {
data class Favorite ( val favorited: Boolean ) : Payloads ()
data class Retweet ( val retweeted: Boolean ) : Payloads () } G
 
                sealed class Payloads {
data class Favorite ( val favorited: Boolean ) : Payloads ()
data class Retweet ( val retweeted: Boolean ) : Payloads ()
data class CountUpdate (
val favorites: Long ,
val retweets: Long ,
val replies: Long ) : Payloads () } G
 
                override fun onBindViewHolder ( holder: TweetViewHolder ,
position: Int , payloads: List < Any
) {
} 1
 
                override fun onBindViewHolder ( holder: TweetViewHolder ,
position: Int , payloads: List < Any
) {
payloads . forEach {
} 2
} 1
 
                override fun onBindViewHolder ( holder: TweetViewHolder ,
position: Int , payloads: List < Any
) {
payloads . forEach {
when ( it ) {
}
3
} 2
} 1
 
                override fun onBindViewHolder ( holder: TweetViewHolder ,
position: Int , payloads: List < Any
) {
payloads . forEach {
when ( it ) {
is Favorite -> holder . favoriteIcon . isActivated
= it . favorited
}
3
} 2
} 1
 
                override fun onBindViewHolder ( holder: TweetViewHolder ,
position: Int , payloads: List < Any
) {
payloads . forEach {
when ( it ) {
is Favorite -> holder . favoriteIcon . isActivated
= it . favorited
}
3
} 2
} 1
 
                override fun onBindViewHolder ( holder: TweetViewHolder ,
position: Int , payloads: List < Any
) {
payloads . forEach {
when ( it ) {
is Favorite -> holder . favoriteIcon . isActivated
= it . favorited
}
3
} 2
} 1 sealed class Payloads {
data class Favorite ( val favorited: Boolean ) : Payloads ()
data class Retweet ( val retweeted: Boolean ) : Payloads ()
data class CountUpdate (
val favorites: Long ,
val retweets: Long ,
val replies: Long ) : Payloads () } G
 
                override fun onBindViewHolder ( holder: TweetViewHolder ,
position: Int , payloads: List < Any
) {
payloads . forEach {
when ( it ) {
is Favorite -> holder . favoriteIcon . isActivated
= it . favorited
}
3
} 2
} 1
 
                override fun onBindViewHolder ( holder: TweetViewHolder ,
position: Int , payloads: List < Any
) {
payloads . forEach {
when ( it ) {
is Favorite -> holder . favoriteIcon . isActivated
= it . favorited
is Retweet -> holder . retweetIcon . isActivated
= it . retweeted
}
3
} 2
} 1
 
                override fun onBindViewHolder ( holder: TweetViewHolder ,
position: Int , payloads: List < Any
) {
payloads . forEach {
when ( it ) {
is Favorite -> holder . favoriteIcon . isActivated
= it . favorited
is Retweet -> holder . retweetIcon . isActivated
= it . retweeted
is CountUpdate -> {
holder . apply {
favoriteCount . text
= it . favorites . toString ()
retweetCount . text
= it . retweets . toString ()
replyCount . text
= it . replies . toString ()
} 5
} 4
}
3
} 2
} 1
 
                 
                It takes great salesmanship to convince a customer to buy something from you that isn't built or isn't finished.
   Fred Wilson
 
                 
                 
                Step 3 Step 2 Step 1
 
                Step 1 Step 3 You Step 2
 
                Step 3 Management Step 2 Step 1
 
                Team Step 3 Step 2 Step 1
 
                You Get excited.
 
                Never doubt that a small group of thoughtful, committed citizens can change the world; indeed, it's the only thing that ever has.
Margaret Mead (Def. not talking about tech)
 
                Be enthusiastic
 
                Adoption is work. If you want it, you need to earn it.
 
                Management Be persuasive.
 
                I call it my billion- dollar mistake . Sir Charles Antony Richard Hoare
 
                One of the most feared expressions in modern times is 'The computer is down.'
Norman Ralph Augustine
 
                 
                Jake Wharton
@JakeWharton
Ty p e   s y s t e m s   a r e   a   f o r m   o f   t e s t s .   I   d e c l a r e   a n   e x p e c t e d
type and the tests (aka compiler) validates the actual ones.
6:43 PM - 11 Jan 2017
74
Follow
16
 
                 
                Team Do the work.
 
                Ellen Shapiro
@designatednerd My style: “I’m the idiot who went down the rabbit hole first, and I’m here to tell you which path leads to fluffy bunnies vs. angry moles.” 14 Mar Ellen Shapiro
@designatednerd My favorite bit of any talk I give is talking about the dumb shit I did so the audience doesn’t do it. Makes the hair pulled out worth it. 4:56 PM - 14 Mar 2017 1 Follow
 
                Define success
 
                 
                 
                http://blog.danlew.net/
 
                On-boarding should be a first class citizen
 
                Show up
 
                 
                What’s next? Kotlin documentation and koans
https://kotlinlang.org/
Android Kotlin documentation
https://developer.android.com/kotlin/index.html
Kotlin In Action
Dimitry Jemerov, Svetlana Isakova
 
                +Christina Lee @RunChristinaRun #KotlinIsHere Thank you!
+Jake Wharton @JakeWharton
 
                