Diferença entre with e run no Kotlin

Fazwith erun têm a mesma funcionalidade apenas com sintaxe diferente ou existem grandes diferenças entrewith erun?

Qual é o caminho certo?

adapter.run {
    notifyDataSetChanged()
    if (activityDetails.isEmpty())
        emptyText.visibility = View.VISIBLE
    else 
       emptyText.visibility = View.GONE
}


with(adapter){
   notifyDataSetChanged()
   if (activityDetails.isEmpty())
       emptyText.visibility = View.VISIBLE
   else 
       emptyText.visibility = View.GONE
}