+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...

} TextView tv

// ...

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...

} MainActivity.kt val tv

// ...

Log . d ( "MainActivity" ,

"Alpha: "

tv . alpha )

tv . alpha

0f

TextView.java public float getAlpha () {

// Retrieve value...

} 1

public void setAlpha ( float alpha ) {

// Set value...

} 2

MainActivity.kt val tv

// ...

Log . d ( "MainActivity" ,

"Alpha: "

tv . alpha )

tv . alpha

0f

TextView.java public float getAlpha () {

// Retrieve value...

} 1

public void setAlpha ( float alpha ) {

// Set value...

} 2

MainActivity.kt val tv

// ...

Log . d ( "MainActivity" ,

"Alpha: "

tv . alpha )

tv . alpha

0f

TextView.java public float getAlpha () {

// Retrieve value...

} 1

public void setAlpha ( float alpha ) {

// Set value...

} 2

MainActivity.kt val tv

// ...

Log . d ( "MainActivity" ,

"Alpha: "

tv . 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 ) {

val view

views . getChildAt ( index )

// TODO do something with view

}

MainActivity.kt val views = // ... for ( index in 0 until views . childCount ) {

val view

views . getChildAt ( index )

// TODO do something with view

} 1

MainActivity.kt val views = // ... for ( index in 0 until views . childCount ) {

val view

views . getChildAt ( index )

// TODO do something with view

} 1

MainActivity.kt val views = // ... for ( index in 0 until views . childCount ) {

val view

views . getChildAt ( index )

// TODO do something with view

}

MainActivity.kt val views = // ... for ( index in 0 until views . childCount ) { Z

val view

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

MainActivity.kt val views = // ... // TODO do something with view ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

getChildAt ( index )

MainActivity.kt val views = // ...

val first

views [ 0 ]

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

getChildAt ( index ) // TODO do something with view

MainActivity.kt val views = // ...

val first

views [ 0 ]

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

getChildAt ( index ) // TODO do something with view

MainActivity.kt val views = // ...

val first

views [ 0 ]

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

getChildAt ( index ) // TODO do something with view

MainActivity.kt val views = // ...

val first

views [ 0 ] views -= first

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

getChildAt ( index )

operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child ) // TODO do something with view

MainActivity.kt val views = // ...

val first

views [ 0 ] views -= first

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

getChildAt ( index )

operator fun ViewGroup . minusAssign ( child: View ) = removeView ( child ) // TODO do something with view

MainActivity.kt val views = // ...

val first

views [ 0 ] views -= first views += first

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= first views += first

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= first views += first if ( first in views ) doSomething ()

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= first views += first if ( first in views ) doSomething ()

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= first views += first if ( first in views ) doSomething ()

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= first views += first if ( first in views ) doSomething ()

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething ()

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views.get ( 0 ) views . minusAssign ( first )

views . plusAssign ( first )

if ( views . contains ( first )) doSomething ()

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething ()

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething () Log . d ( "MainActivity" , "View count: ${ views . size } " )

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething () Log . d ( "MainActivity" , "View count: ${ views . size } " )

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething () Log . d ( "MainActivity" , "View count: ${ views . size } " )

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething () Log . d ( "MainActivity" , "View count: ${ views . size } " )

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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 = // ...

val first

views [ 0 ] views -= fir st views += fi rst if ( first in views ) doSomething () Log . d ( "MainActivity" , "View count: ${ views . size } " )

ViewGroups.kt operator fun ViewGroup . get ( index: Int ) : View ?

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

val visibleHeight

views . children () . filter { it . visibility

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

}

val visibleHeight

views . children () . filter { it . visibility

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

} 4 MainActivity.kt val result

trace ( "foo" ) {

expensiveCalculation () } 1 val result

< 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

} 4 MainActivity.kt val result

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

deleteByFirstName

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

deleteByFirstName

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