9. Анонимные функции
9
class Items {
def mapSum(func: Item => Int): Int = {
var sum = 0
for (item <- this.items)
sum += func(item)
sum
}
}
mapSum(item => item.weight)
mapSum(_.weight)
mapSum { item =>
item.weight
}
10. Анонимные функции
Ну лямбды, а где их использовать?
10
val shownRoutes = infoWindowMarkers
.filter(_.isShown)
.map { m =>
val info = vehicleMarkers(m).info
info.routeId
}
17. Scala: read-only interface / immutable collection
17
def getStops: collection.Seq[String] = stops
val stops = route.getStops
stops += "stop"
// error: value += is not a member of Seq[String].
val extendedStops = stops :+ "stop"
18. Scala: immutable by default
18
collection.List
collection.immutable.List = List
collection.mutable.List
21. Simple Java class
21
class File {
String name;
long size;
bool executable;
File(String name, long size, bool executable) {
this.name = name;
this.size = size;
this.executable = executable;
}
@Override bool equals(Object other) { … }
…
22. Initializers
22
class File(name: String, size: Long, executable: Boolean) {
def getName: String = name
def getSize: Long = size
def isExecutable: Boolean = executable
}
val file = new File("autoexec.bat", 1337, false)
println(file.getName)
23. Initializers
23
class File(val name: String,
val size: Long,
val executable: Boolean)
val file = new File("autoexec.bat", 1337, false)
println(file.name)
24. Case class
24
case class File(name: String, size: Long, executable: Boolean)
val file = File("autoexec.bat", 1337, false)
println(file.name)
val updated = file.copy(size = 1400)
file match {
case File("autoexec.bat", _, _) => nostalgia.on()
case File(name, _, _) => ordinary_file()
}
66. Доступа к protected static членам
https://issues.scala-lang.org/browse/SI-1806 (закрыт)
ItemizedOverlay, View.mergeDrawableStates
66
abstract public class ViewStaticBridge extends View {
public ViewStaticBridge(Context context) { super(context); }
public static int[] mergeDrawableStates(int[] baseState, int[] additionalState) {
return View.mergeDrawableStates(baseState, additionalState);
}
}
67. Parcellable::CREATOR
67
case class User(age: Int, name: String) extends Parcelable {
protected this(source: Parcel) =
this(source.readInt(), source.readString())
override def describeContents() = 0
override def writeToParcel(destination: Parcel, flags: Int) { … }
}
object User
{
override val CREATOR = new Parcelable.Creator[User] {
override def createFromParcel(source: Parcel) = new User(source)
override def newArray(size: Int) = new Array[User](size)
}
}
68. 65K Reference Limit
Scala поможет быстрее достичь высот!
68
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
69. 65K Reference Limit
Стандартная библиотека: много классов, много методов;
в 2.10 стандартную библиотеку разделили
ProGuard нужен даже для debug-сборок
Multi-DEX — не использовал
linearAlloc bug
Размер gortrans — 1,5 Мб
〉
〉
〉
〉
69
70. ProGuard
Требуется несколько настроек, чтобы не вырезались
нужные части стандартной библиотеки
〉
70
-dontwarn scala.concurrent.forkjoin.**
-dontwarn scala.concurrent.impl.AbstractPromise
-dontwarn scala.concurrent.util.Unsafe
-dontwarn scala.reflect.**
# See https://issues.scala-lang.org/browse/SI-5397
-keep class scala.collection.SeqLike {
public protected *;
}
…
71. Скорость компиляции
Scala компилирует медленнее Java в 2-10 раз
Частично проблема решается FSC (Fast Scala Compiler
daemon) и sbt incremental compilation
Усугубляется необходимостью запуска ProGuard (можно
решить предустановкой Scala в эмуляторе)
〉
〉
〉
71
72. Потребление ресурсов
Scala провоцирует использовать много Closures
Но никто не мешает использовать Java-like код в
критичных точках
Макросы позволяют создавать zero-cost абстракции
〉
〉
72