SlideShare a Scribd company logo
Scala for Android
Русин Александр
Android developer
alexandr.rusin@gmail.com
Удобно сделать на Java?
val values = for {
str <- List("1", "2", "3", "string", "5")
int <- str.parseInt.toOption
} yield (new Abs()).value(int)
Log.d("debug", "" + ImmutableSet.of(values))
[List(1.0, 2.0, 3.0, 5.0)]
Почему Scala?
Быстрый старт для Android разработчиков
Знакомый стек инструментов
Постепенный перевод текущего проекта
Функциональный язык
Инструменты
Android SDK
JDK 8
Android Studio
Gradle
Gradle plugin
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:1.0.1'
classpath "jp.leafytree.gradle:gradle-android-scala-plugin:1.3.2"
}
}
apply plugin: "jp.leafytree.android-scala"
sourceSets {
main {
scala {
srcDir "path/to/main/scala"
}
}
}
https://github.com/saturday06/gradle-android-scala-plugin
Hello world, Scala!
class HelloActivity extends Activity {
override def onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_hello)
val scalaTextView = findViewById(R.id.scala_text_view)
.asInstanceOf[TextView]
scalaTextView.setText(“HELLO SCALA!!!”)
}
}
Scala сборка apk
Время сборки ~ 1 мин
Объем созданной апк ~ 3 М
Время сборки ~ 1 мин
Объем созданной апк ~ 900 kB
Без proGuard
C proGuard
Паттерны (статичный фабричный м-д)
http://habrahabr.ru/post/212121/
trait Animal
private class Dog extends Animal
private class Cat extends Animal
object Animal {
def apply(kind: String) = kind match {
case "dog" => new Dog()
case "cat" => new Cat()
}
}
Пример вызова
Animal("dog")
Паттерны (Синглтон)
object Cat extends Runnable {
def run() {
}
}
Пример вызова:
Cat.run()
http://habrahabr.ru/post/212121/
Паттерны (Объект-значение)
val point = (1, 2) // new Tuple2(1, 2)
http://habrahabr.ru/post/212121/
type Point = (Int, Int) // Tuple2[Int, Int]
val point: Point = (1, 2)
case class Point(x: Int, y: Int)
val point = Point(1, 2)
Паттерны (Стратегия)
type Strategy = (Int, Int) => Int
class Context(computer: Strategy) {
def use(a: Int, b: Int) {
computer(a, b)
}
}
val add: Strategy = _ + _
val multiply: Strategy = _ * _
new Context(multiply).use(2, 3)
http://habrahabr.ru/post/212121/
Паттерны (Команда)
object Invoker {
private var history: Seq[() => Unit] = Seq.empty
def invoke(command: => Unit) {
command
history :+= command _
}
}
Invoker.invoke(println("foo"))
Invoker.invoke { println("bar 1")
println("bar 2") }
http://habrahabr.ru/post/212121/
Трейты
trait Similarity {
def isSimilar(x: Any): Boolean
def isNotSimilar(x: Any): Boolean =
!isSimilar(x)
}
http://www.scala-lang.org/old/node/126
Трейты
class Point(xc: Int, yc: Int) extends Similarity
{
var x: Int = xc
var y: Int = yc
def isSimilar(obj: Any) =
obj.isInstanceOf[Point] &&
obj.asInstanceOf[Point].x == x
}
http://www.scala-lang.org/old/node/126
Трейты
http://www.scala-lang.org/old/node/126
object TraitsTest extends Application {
val p1 = new Point(2, 3)
val p2 = new Point(2, 4)
val p3 = new Point(3, 3)
println(p1.isNotSimilar(p2)) // false
println(p1.isNotSimilar(p3)) // true
println(p1.isNotSimilar(2)) // true
}
Коллекции
https://twitter.github.io/scala_school/ru/collections.html
Структуры данных
Списки
Наборы
Кортеж
Карты
Комбинаторы
map
foreach
filter
zip
partition
find
drop и dropWhile
foldRight и foldLeft
flatten
flatMap
Коллекции
https://twitter.github.io/scala_school/ru/collections.html
Val numbers = List(2, 4, 6, 8)
numbers.filter((i: Int) => i % 2 == 0)
List[Int] = List(2, 4)
List(1, 2, 3).zip(List("a", "b", "c"))
List[(Int, String)] = List((1,a), (2,b),
(3,c))
ФВП
val people = Array("Андрей", "Сергей", "Александр")
people.foreach { name:String => println("Person: " + name) }
// Person: Андрей
// Person: Сергей
// Person: Александр
http://blog.lakhtin.com/post/2348212568/closure
Замыкания
http://blog.lakhtin.com/post/2348212568/closure
scala> more = 100
more: Int = 100
scala> val addMore = (x: Int) => x + more
addMore: (Int) => Int = <function1>
scala> addMore(10)
res17: Int = 110
Замыкания
http://blog.lakhtin.com/post/2348212568/closure
scala> someNumbers
res19: List[Int] = List(1, 2, 3, 5, 8, 13, 21)
scala> var summa = 0
summa: Int = 0
scala> someNumbers.foreach(summa += _)
scala> summa
res21: Int = 53
scala> someNumbers.foreach(summa += _)
scala> summa
res23: Int = 106
Библиотеки (Scaloid)
val button = new Button(context)
button.setText("Greet")
button.setOnClickListener(new
OnClickListener() {
def onClick(v: View) {
Toast.makeText(context, "Hello!",
Toast.LENGTH_SHORT).show()
}
})
layout.addView(button)
Библиотеки (Scaloid)
SButton("Greet", toast("Hello!"))
Скорость выполнения
Быстрая сортировка (мс)
Java Scala
100 115 1165
500 863 7513
1000 1562 18394
Проблемы
faild_dex_opt (большой размер class.dex)
Возможно не все можно на Scala
Меньше комьюнити
Версионность языка Scala
Решение
Multi - dex ( начиная с 14 API)
Часть проекта можно написать на Java
Спасибо за внимание!
Вопросы?
Материалы
Исходные коды
https://github.com/ulx/scalaSampleAndroid
Паттерны в scala
http://habrahabr.ru/post/212121/
Коллекции
https://twitter.github.io/scala_school/ru/collectio
ns.html
Пример trait
http://www.scala-lang.org/old/node/126
Материалы
Замыкания
http://blog.lakhtin.com/post/2348212568/closure

More Related Content

What's hot

Lec 3
Lec 3Lec 3
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
Noveo
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream API
CEE-SEC(R)
 
Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всём
Ruslan Balkin
 
Scala - my path
Scala - my pathScala - my path
Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
Система дистанционного обучения MyDLS
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Platonov Sergey
 
Конкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнеры
Platonov Sergey
 
Экстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverЭкстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java Driver
Vitebsk DSC
 
Angular 2. lost in translation
Angular 2.  lost in translationAngular 2.  lost in translation
Angular 2. lost in translation
allfayn
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
Alexandr Graschenkov
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
tvaleev
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
Alex Tumanoff
 
Java8. Innovations
Java8. InnovationsJava8. Innovations
Java8. Innovations
Nakraynikov Oleg
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Platonov Sergey
 
ReactiveUI: Rx + MVVM
ReactiveUI: Rx + MVVMReactiveUI: Rx + MVVM
ReactiveUI: Rx + MVVMStas Shusha
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Platonov Sergey
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
Platonov Sergey
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
Nikolay Pisarev
 

What's hot (20)

Lec 3
Lec 3Lec 3
Lec 3
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream API
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всём
 
Scala - my path
Scala - my pathScala - my path
Scala - my path
 
Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
 
Конкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнеры
 
Экстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverЭкстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java Driver
 
Angular 2. lost in translation
Angular 2.  lost in translationAngular 2.  lost in translation
Angular 2. lost in translation
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
 
Java8. Innovations
Java8. InnovationsJava8. Innovations
Java8. Innovations
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
ReactiveUI: Rx + MVVM
ReactiveUI: Rx + MVVMReactiveUI: Rx + MVVM
ReactiveUI: Rx + MVVM
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
 

Viewers also liked

Lec 14
Lec 14Lec 14
Lec 15
Lec 15Lec 15
Lec 1
Lec 1Lec 1
Lec 5
Lec 5Lec 5
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?Roman Timushev
 
Lec 6
Lec 6Lec 6
Lec 4
Lec 4Lec 4
Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Alexander Podkhalyuzin
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
Арсений Жижелев
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузера
CodeFest
 
Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)
Alexander Podkhalyuzin
 
Scala #3
Scala #3Scala #3
Scala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEAScala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEA
Alexander Podkhalyuzin
 

Viewers also liked (20)

Lec 14
Lec 14Lec 14
Lec 14
 
Lec 15
Lec 15Lec 15
Lec 15
 
Lec 1
Lec 1Lec 1
Lec 1
 
Lec 5
Lec 5Lec 5
Lec 5
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?
 
Lec 6
Lec 6Lec 6
Lec 6
 
Lec 11
Lec 11Lec 11
Lec 11
 
Lec 4
Lec 4Lec 4
Lec 4
 
Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)
 
Erlang
ErlangErlang
Erlang
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Scala #4
Scala #4Scala #4
Scala #4
 
Scala #5
Scala #5Scala #5
Scala #5
 
Scala magic
Scala magicScala magic
Scala magic
 
Scala training
Scala trainingScala training
Scala training
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузера
 
Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)
 
Scala #2
Scala #2Scala #2
Scala #2
 
Scala #3
Scala #3Scala #3
Scala #3
 
Scala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEAScala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEA
 

Similar to Scala for android

Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Dmitry Stropalov
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
Anton Kirillov
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Magneta AI
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)ScalaNsk
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark Job
Provectus
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
Арсений Жижелев
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backendGeeksLab Odessa
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
Technopark
 
Javascript in modern scala backend. [russian]
Javascript in modern scala backend.  [russian]  Javascript in modern scala backend.  [russian]
Javascript in modern scala backend. [russian] Ruslan Shevchenko
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
Andrey Karpov
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
Ivan Trifonov
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
Alex Ott
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
Andrey Karpov
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
Technopark
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1Eduard Antsupov
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
Alex Filatov
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
Яковенко Кирилл
 

Similar to Scala for android (20)

Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark Job
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backend
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Javascript in modern scala backend. [russian]
Javascript in modern scala backend.  [russian]  Javascript in modern scala backend.  [russian]
Javascript in modern scala backend. [russian]
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Bytecode
BytecodeBytecode
Bytecode
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Scala On Rest
Scala On RestScala On Rest
Scala On Rest
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 

More from Alexander Rusin

Lec 13
Lec 13Lec 13
Lec 12
Lec 12Lec 12
Lec 10
Lec 10Lec 10
Lec 9
Lec 9Lec 9
Thread
ThreadThread
Lec 2
Lec 2Lec 2

More from Alexander Rusin (6)

Lec 13
Lec 13Lec 13
Lec 13
 
Lec 12
Lec 12Lec 12
Lec 12
 
Lec 10
Lec 10Lec 10
Lec 10
 
Lec 9
Lec 9Lec 9
Lec 9
 
Thread
ThreadThread
Thread
 
Lec 2
Lec 2Lec 2
Lec 2
 

Scala for android