Ebben a reszben a lambda-krol lesz szo, azon belul is a retrolambdarol.
Eloszor is miert jo nekunk az RxAndroid, es a lambdak?
Lecsokkenti a kod nagysagat, illetve elkerulheto vele a callback hell.
OK, be kell allitanunk nehany dolgot az android projectunkbe, hogy hasznalni tudjuk a retrolambdat, nezzuk mik ezek.
A root build.gradle-be a dependencybe ezt bemasolni:
classpath 'me.tatarka:gradle-retrolambda:3.1.0'
Ez a library atforditja a lamdba kodot valami olyasmive, amit az android studio is erteni fog.
az app gradle elso soraba pedig ezt:
apply plugin: 'me.tatarka.retrolambda'
majd ezt
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
vegul a retrolambdat
retrolambda {
jdk System.getenv('JAVA8_HOME')
oldJdk System.getenv('JAVA7_HOME')
}
Elvileg ha minden flottul ment es run-oljuk a cuccot pl device-en,
akkor megy, ha nem, akkor kiirja valoszinu ezt:
Error:Execution failed for task ‘:app:compileDebugJava’.
> When running gradle with java 6 or 7, you must set the path to jdk8,
either with property retrolambda.jdk or environment variable JAVA8_HOME
Valszeg java7 van beallitva a settings-ben, ezert egyszeru a megoldasa:
File -> Project Structure -> SDK Location -> JDK Location
Itt a JDK7 utvonalat atrakjuk a JDK8 utvonalara. Ezutan mukodni fog.
Ha minden jol ment, akkor bizonyos kodreszleteink elszurkulnek, es kiir ra ilyesmiket:
Anonymous new Action1<String>() can be replaced with lambda...
Alt+Enterre pedig ki is csereli a kodot, azaz egyszerusiti.
Nezzuk milyen volt:
public void listTest() {
String[] manyWords = new String[]{"a", "b", "c"};
Observable<String> oneByOneObservable = Observable.from(manyWords);
Action1<String> action = new Action1<String>() {
@Override
public void call(String s) {
Toast.makeText(mAct, s, Toast.LENGTH_LONG).show();
}
};
Func1<String, String> map = new Func1<String, String>() {
@Override
public String call(String s) {
return s.toUpperCase() + s.toLowerCase() + s.toUpperCase();
}
};
oneByOneObservable
.observeOn(AndroidSchedulers.mainThread())
.map(map)
.subscribe(action);
}
Es milyen lett:
public void listTest() {
String[] manyWords = new String[]{"a", "b", "c"};
Observable<String> oneByOneObservable = Observable.from(manyWords);
Action1<String> action = s -> Toast.makeText(mAct, s, Toast.LENGTH_LONG).show();
Func1<String, String> map = s -> s.toUpperCase() + s.toLowerCase() + s.toUpperCase();
oneByOneObservable
.observeOn(AndroidSchedulers.mainThread())
.map(map)
.subscribe(action);
}
Nezzunk egy masik peldat:
Func1<String, String> toUpperCaseMap = new Func1<String, String>() {
@Override
public String call(String s) {
return s.toUpperCase();
}
};
Ezt eloszor egyszerusiteni tudjuk lambdaval:
Func1<String, String> toUpperCaseMap = s -> s.toUpperCase();
majd:
Func1<String, String> toUpperCaseMap = String::toUpperCase;