Android Programjaim

Android fejlesztes, java, kotlin, web.. miegymas:)

RxAndroid - 3. resz - Retrolambda

2016. július 06. 11:56 - lacas82

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;