Xây dựng Builder Pattern với Java 8 Lambda ?


#1

Chào các thầy và các bạn,

Mình đang tìm hiểu về cách xây dựng Builder Pattern trong Kotlin. Trong project của mình hiện tại đang custom một dialog. Code của mình sau khi viết đã chạy ok hết, tuy nhiên mình muốn viết lại sao cho có thể khai triển trên Java 8 dưới dạng biểu thức Lambda

Code cụ thể của mình:

Source code mình custom lại một dialog theo mô hình builder pattern

class CustomDialogList(context: Context,
                       private var title: Int?,
                       private var icon: Int?,
                       private var map: Map<String, Any>,
                       private var listener: OnItemClickListener) : Dialog(context) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.custom_dialog_list)

        txtTitle.text = context.getString(title!!)
        txtTitle.setCompoundDrawablesWithIntrinsicBounds(icon!!, 0, 0, 0)

        val listString: MutableList<String> = mutableListOf()
        val listObject: MutableList<Any> = mutableListOf()
        for ((key, value) in map) {
            listString.add(k)
            listObject.add(v)
        }

        val adapter = ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, listString)
        listView.adapter = adapter
        listView.setOnItemClickListener { _, _, i, _ ->
            listener.onClickResult(this, listObject[i], listString[i], i)
        }
    }

    interface OnItemClickListener {
        fun onClickResult(dialog: CustomDialogList, obj: Any?, text: String, position: Int)
    }

    class Builder(private var context: Context) {
        private var listener: OnItemClickListener? = null
        private var title: Int? = null
        private var icon: Int? = null
        private var map: Map<String, Any> = mapOf()

        fun withTitle(title: Int): Builder {
            this.title = title
            return this
        }

        fun withIcon(icon: Int): Builder {
            this.icon = icon
            return this
        }

        fun withMap(map: Map<String, Any>): Builder {
            this.map = map
            return this
        }

        fun setOnItemClick(listener: OnItemClickListener): Builder {
            this.listener = listener
            return this
        }

        fun show() = CustomDialogList(context, title, icon, map, listener!!).show()
    }
}

Kết quả biểu thức code mình có được sau khi custom

CustomDialogList.Builder(this)
                .withTitle(R.string.add)
                .withIcon(R.drawable.ic_add)
                .withMap(map)
                .setOnItemClick(object : CustomDialogList.OnItemClickListener {
                    override fun onClickResult(dialog: CustomDialogList, obj: Any?, text: String, position: Int) {
                         // do something
                        dialog.dismiss()
                    }
                }).show()

Còn đây là một ví dụ về biểu thức Lambda mà mình muốn xây dựng

MaterialDialog.Builder(this)
                .title(R.string.add)
                .items(list)
                .itemsCallback({ dialog, obj, text, position ->
                    // do something
                    dialog.dismiss()
                })
                .show()

Mong các thầy và các bạn chỉ giúp Cảm ơn thầy và các bạn!