Slide 1

Slide 1 text

Convert Java to Kotlin 2017.07.22 Shibuya.apk #16 @satorufujiwara

Slide 2

Slide 2 text

About me Satoru Fujiwara (@satorufujiwara) Android Engineer @CyberAgent ,Inc Shibuya.apk

Slide 3

Slide 3 text

Kotlin & Me FRESH! ΛKotlinͰ։ൃ (2015೥3݄ʙ) λοϓϧ஀ੜͷKotlinԽ (2017೥6݄ʙ) Kotlin Advent Calendar (2015/2016) -ʮ2016೥ɺKotlinͰAndroid։ൃ͢Δํ΁ʯ @Qiita ( goo.gl/0medax ) Kotlinೖ໳·Ͱͷॿ૸ಡຊ ( goo.gl/5vUT7o )

Slide 4

Slide 4 text

Convert Java to Kotlin

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Convert Java to Kotlin Λ࢖ͬͨޙͷमਖ਼Օॴ

Slide 7

Slide 7 text

Target github.com/googlesamples/android-architecture-components/tree/master/BasicSample

Slide 8

Slide 8 text

஫ : m-prefix͸ͦͷ··ʹ͍ͯ͠·͢

Slide 9

Slide 9 text

1. static final

Slide 10

Slide 10 text

//com.example.android.persistence.ProductFragment //Java private static final String KEY_PRODUCT_ID = “product_id"; //Kotlin (Auto) companion object { private val KEY_PRODUCT_ID = “product_id" }

Slide 11

Slide 11 text

//com.example.android.persistence.ProductFragment //Java private static final String KEY_PRODUCT_ID = “product_id"; //Kotlin (Auto) companion object { private val KEY_PRODUCT_ID = “product_id" } //Kotlin (Manual) companion object { private const val KEY_PRODUCT_ID = “product_id" }

Slide 12

Slide 12 text

2. static method

Slide 13

Slide 13 text

//com.example.android.persistence.ProductFragment //Java public static ProductFragment forProduct(int productId) { ProductFragment fragment = new ProductFragment(); Bundle args = new Bundle(); args.putInt(KEY_PRODUCT_ID, productId); fragment.setArguments(args); return fragment; } //Kotlin (Auto) companion object { fun forProduct(productId: Int): ProductFragment { val fragment = ProductFragment() val args = Bundle() args.putInt(KEY_PRODUCT_ID, productId) fragment.arguments = args return fragment } }

Slide 14

Slide 14 text

//com.example.android.persistence.ProductFragment //Java public static ProductFragment forProduct(int productId) { ProductFragment fragment = new ProductFragment(); Bundle args = new Bundle(); args.putInt(KEY_PRODUCT_ID, productId); fragment.setArguments(args); return fragment; } //Kotlin (Manual) companion object { fun forProduct(productId: Int) = ProductFragment().apply { arguments = Bundle().apply { putInt(KEY_PRODUCT_ID, productId) } } }

Slide 15

Slide 15 text

3. Nullable & val

Slide 16

Slide 16 text

//com.example.android.persistence.ProductFragment //Java private CommentAdapter mCommentAdapter; public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //... mCommentAdapter = new CommentAdapter(mCommentClickCallback); mBinding.commentList.setAdapter(mCommentAdapter); return mBinding.getRoot(); } //Kotlin (Auto) private var mCommentAdapter: CommentAdapter? = null override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { //... mCommentAdapter = CommentAdapter(mCommentClickCallback) mBinding!!.commentList.adapter = mCommentAdapter return mBinding!!.root }

Slide 17

Slide 17 text

//com.example.android.persistence.ProductFragment //Java private CommentAdapter mCommentAdapter; public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //... mCommentAdapter = new CommentAdapter(mCommentClickCallback); mBinding.commentList.setAdapter(mCommentAdapter); return mBinding.getRoot(); } //Kotlin (Manual) private val mCommentAdapter: CommentAdapter = CommentAdapter(mCommentClickCallback) override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { //... mBinding!!.commentList.adapter = mCommentAdapter return mBinding!!.root }

Slide 18

Slide 18 text

//com.example.android.persistence.ProductFragment //Java private CommentAdapter mCommentAdapter; public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //... mCommentAdapter = new CommentAdapter(mCommentClickCallback); mBinding.commentList.setAdapter(mCommentAdapter); return mBinding.getRoot(); } //Kotlin (Manual) private val mCommentAdapter = CommentAdapter(mCommentClickCallback) override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { //... mBinding!!.commentList.adapter = mCommentAdapter return mBinding!!.root }

Slide 19

Slide 19 text

propertyͷ༏ઌॱҐ • Non-Null & val • Non-Null & var • Nullable & var

Slide 20

Slide 20 text

Example 1

Slide 21

Slide 21 text

//Non-Null & val private val mCommentAdapter = CommentAdapter(activity) //runtime error

Slide 22

Slide 22 text

//Non-Null & val private val mCommentAdapter = CommentAdapter(activity) //runtime error private val mCommentAdapter by lazy { CommentAdapter(activity) }

Slide 23

Slide 23 text

Example 2

Slide 24

Slide 24 text

// Nullable & var private var mCommentAdapter :CommentAdapter? = null

Slide 25

Slide 25 text

// Nullable & var private var mCommentAdapter :CommentAdapter? = null //Non-Null & var private var mCommentAdapter :CommentAdapter by Delegates.notNull()

Slide 26

Slide 26 text

// Nullable & var private var mCommentAdapter :CommentAdapter? = null //Non-Null & var private var mCommentAdapter :CommentAdapter by Delegates.notNull() //Non-Null & var private lateinit var mCommentAdapter :CommentAdapter

Slide 27

Slide 27 text

propertyͷ༏ઌॱҐ • Non-Null & val • Non-Null & val (lazy) • Non-Null & var (lateinit) • Non-Null & var (lazy) • Nullable & var

Slide 28

Slide 28 text

4. DataBinding

Slide 29

Slide 29 text

//com.example.android.persistence.ProductFragment //Java private ProductFragmentBinding mBinding; public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mBinding = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false); //... mBinding.commentList.setAdapter(mCommentAdapter); return mBinding.getRoot(); } //Kotlin (Auto) private var mBinding: ProductFragmentBinding? = null override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { mBinding = DataBindingUtil.inflate(inflater!!, R.layout.product_fragment, container, false) //... mBinding!!.commentList.adapter = mCommentAdapter return mBinding!!.root }

Slide 30

Slide 30 text

//com.example.android.persistence.ProductFragment //Java private ProductFragmentBinding mBinding; public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mBinding = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false); //... mBinding.commentList.setAdapter(mCommentAdapter); return mBinding.getRoot(); } //Kotlin (Manual) private lateinit var mBinding: ProductFragmentBinding override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { mBinding = DataBindingUtil.inflate(inflater!!, R.layout.product_fragment, container, false) //... mBinding.commentList.adapter = mCommentAdapter return mBinding.root }

Slide 31

Slide 31 text

//com.example.android.persistence.ProductFragment //Java private ProductFragmentBinding mBinding; public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mBinding = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false); //... mBinding.commentList.setAdapter(mCommentAdapter); return mBinding.getRoot(); } //Kotlin (Manual) private lateinit var mBinding: ProductFragmentBinding override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { mBinding = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false) //... mBinding.commentList.adapter = mCommentAdapter return mBinding.root }

Slide 32

Slide 32 text

DataBinding & lateinit

Slide 33

Slide 33 text

DataBinding & lateinit

Slide 34

Slide 34 text

//com.example.android.persistence.ProductFragment //Java private ProductFragmentBinding mBinding; public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mBinding = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false); //... mBinding.commentList.setAdapter(mCommentAdapter); return mBinding.getRoot(); } //Kotlin (Manual) private lateinit var mBinding: ProductFragmentBinding override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { mBinding = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false) //... mBinding.commentList.adapter = mCommentAdapter return mBinding.root }

Slide 35

Slide 35 text

//com.example.android.persistence.ProductFragment //Java private ProductFragmentBinding mBinding; public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mBinding = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false); //... mBinding.commentList.setAdapter(mCommentAdapter); return mBinding.getRoot(); } //Kotlin (Manual) private lateinit var mBinding: ProductFragmentBinding override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false) .also { mBinding = it mBinding.commentList.adapter = mCommentAdapter }.root

Slide 36

Slide 36 text

είʔϓؔ਺ • let / with / run /apply / also • Kotlin είʔϓؔ਺ ༻్·ͱΊ@Qiita • http://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e • inline prefix public inline fun T.run(block: T.() -> R): R = block()

Slide 37

Slide 37 text

͓·͚

Slide 38

Slide 38 text

͓·͚ • github.com/googlesamples/android-architecture-components • ʮArchitecture Componentʯͷαϯϓϧ͕3छྨެ։͞Ε͍ͯΔ • BasicSample - Shows how to persist data using a SQLite database and Room. Also uses ViewModels and LiveData. • PersistenceContentProviderSample - Shows how to expose data via a Content Provider using Room. • GithubBrowserSample - An advanced sample that uses the Architecture components, Dagger and the Github API. Requires Android Studio 3.0 canary 1

Slide 39

Slide 39 text

͓·͚ • ʰKotlin + Architecture Component + Dagger2ʹΑΔAndroidΞϓϦઃܭʱ@Qiita • goo.gl/z1p8zP • GitHubSampleΛKotlinԽ͢Δ্ͰͷϋϚΓՕॴΛ·ͱΊ·ͨ͠ • Ұ൪ϋϚͬͨͷ͸Dagger2ͷMultibindingػೳΛ࢖͏͜ͱ

Slide 40

Slide 40 text

How to start Kotlin • Official Site : kotl.in/ , kotl.in/android • Kotlin is awesome! (kotlin.link/) • Kotlin ελʔτϒοΫ(੺΂͜ຊ) • Kotlin Advent Calendar (2015/2016) • Kotlinೖ໳·Ͱͷॿ૸ಡຊ( goo.gl/5vUT7o )

Slide 41

Slide 41 text

Thank you ! Let’s enjoy Kotlin