美文网首页Android面试经验
Rxjava2~学渣带你扣rxjava2~ 译文(原创翻译)

Rxjava2~学渣带你扣rxjava2~ 译文(原创翻译)

作者: 品味与回味 | 来源:发表于2017-06-19 18:05 被阅读161次

    原创翻译,请勿转载。希望大家一起进步。

    简介

    当我们学习rxjava的时候,有一天我遇到了rxjava被观察者,我询问的它一些问题。好消息是它真的很好很好 好到让我吃惊,ra真的很坏并且充满着骄傲, 你不想和我们(开发者)交朋友吗而是一直误导我们吗?之后通过沟通我吃惊的意识到了 我的很多观念都是错误的

    我 : 你好吗

    rx :hi 我很好 谢谢

    我 :为什么感觉学习你感觉很难,对于开发者来说你真的不容易。你难道不想和我们做朋友吗

    rx :哈哈、 说真的。    我有一些很好的朋友。他们在很多论坛谈论我。他们谈论我和我的力量。这些大家很一些地方真的很出色,他们和我在一起花费了很多时间。so真的朋友需要你的付出,真诚的付出一些时间。但是有一种情况 他们和我交朋友并不真诚,他们指望我一起工作。但是一段时间之后 他们打开了社交网站。把我遗忘了几个小时。所以你怎么指望我和他们成为真正的朋友呢

    我 :好吧 如果想和你交朋友我应该怎么做

    rx :全身心的投入到我的身上 每一段时间之后 你就会发现我是多么的坦诚

    我 :老实说。我并不擅长集中注意力但是我擅长忽略、我将使用这种无视别的,眼中只有你

    rx :没错。 如果和你一起的时候 你能够忽略外在的一切 除了我之外的话。 我将是你最好的朋友

    我 :wow 我又一种感觉 我们能够成为很好的朋友

    rx :任何人都可以把我当作他最好的朋友

    我 :现在我有一些问题 我能提问吗

    rx :当然 你能够提出任何问题 我将给与你回答,但是一些重要的问题你需要的你拿出一些时间并且投入进去

    我 : 当然 如果我有一些数据并且我想把他转化成为被观察者,我如何在rxjava2实现这一点呢

    rx :回答这么问题需要很长的篇幅,如果你进入我的内部(Rx Java 2可观察类)。你会知道我总共有12904行代码。 任何方法返回的都是你需要的被观察者。 是的,在我这个群体中 我有很多朋友。我可以根据开发的需求如map,filter等来实现自我。但在这里我可以和你分享一些方法,这些方法可以帮你把任何事情都看作被观察者,抱歉  我有一种感觉那将会很长。所幸并不会太无聊、

    1 just();

    通过使用这种方法,您可以将任何对象(s)转换为可观察到的对象(s)。

    String data = "Hello World";

    Observable.just(data).subscribe(s -> System.out.println(s));

    Output:

    Hello World

    如果你有更多的对象,那么你可以通过下面的api来实现

    String data = "Hello World";

    Integer i = 4500;

    Boolean b = true;

    Observable.just(data,i,b).subscribe(s -> System.out.println(s));

    Output:

    Hello World

    4500

    true

    这个api支持最大10个数据

    Observable.just(1,2,3,4,5,6,7,8,9,10).subscribe(s -> System.out.print(s+" "));

    Output:

    1 2 3 4 5 6 7 8 9 10

    举个例子,(对你来说这个可能并不是一个很好的指导,在你的代码中去使用)

    public static void main(String[] args) {

    String username = "username";

    String password = "password";

    System.out.println(validate(username, password));

    }private static boolean validate(String username, String password) {boolean isUsernameValid = username!=null && !username.isEmpty() && username.length() > 3;boolean isPassword = password!=null && !password.isEmpty() && password.length() > 3;return isUsernameValid && isPassword;}

    private static boolean isValid = true;

    private static boolean validate(String username, String password) {Observable.just(username, password).subscribe(s -> {

    if (!(s != null && !s.isEmpty() && s.length() > 3))

    throw new RuntimeException();

    }, throwable -> isValid = false);

    return isValid;

    }

    2 from

    我有很多的api 可以将更加复杂的数据结构转化成为被观察者 如下所示开始关键字

    我觉得这些api的名字就能够说明一切并不需要过多的解释,所以我将给你一些例子 这样你将会用的很舒服

    public static void main(String[] args) {

    List tasks = Arrays.asList(new Tasks(1,"description"),

    new Tasks(2,"description"),new Tasks(4,"description"),

    new Tasks(3,"description"),new Tasks(5,"description"));Observable.fromIterable(tasks).forEach(task -> System.out.println(task.toString()));}

    private static class Tasks {

    int id;String description;

    public Tasks(int id, String description) {this.id = id;this.description = description;}

    @Override

    public String toString() {return "Tasks{" + "id=" + id + ", description='" + description + '\'' + '}';}

    }

    }

    数组

    public static void main(String[] args) {

    Integer[] values = {1,2,3,4,5};

    Observable.fromArray(values)

    .subscribe(v-> System.out.print(v+" "));

    }

    这两个例子足够了。其他的你可以试着去写

    3 creat

    如果你想要定义个被观察者 你可以试着去定义一个

    这个api可以给你很大的力量,但是在我看来 在使用这个之前 你可以去尝试其他的解决方法。因为我有99%你能够从其他的api中找到解决方法。如果不能的话那么你可以使用这个

    public static void main(String[] args) {

    final int a = 3, b = 5, c = 9;

    Observable me = Observable.create(new ObservableOnSubscribe() {

    @Override

    public void subscribe(ObservableEmitter observableEmitter) throws Exception {

    observableEmitter.onNext(a);

    observableEmitter.onNext(b);

    observableEmitter.onNext(c);

    observableEmitter.onComplete();

    }

    });

    me.subscribe(i-> System.out.println(i));

    }

    4. range():

    他就像一个efor循环一个 如下所示

    public static void main(String[] args) {

    Observable.range(1,10)

    .subscribe(i-> System.out.print(i+" "));

    }

    Output:

    1 2 3 4 5 6 7 8 9 10

    一个真实的例子

    public static void main(String[] args) {

    List names = Arrays.asList("Hafiz", "Waleed", "Hussain", "Steve");

    for (int i = 0; i < names.size(); i++) {if(i%2 == 0)continue;System.out.println(names.get(i));

    }Observable.range(0, names.size()).filter(index->index%2==1).subscribe(index -> System.out.println(names.get(index)));

    }

    5. interval():

    这真是一个很棒的

    我给你们看一个例子,你们可以比较两种方法。对于第一个,我使用了一个Java线程,第二个使用了我自己的interval()API,两者都有相同的结果。

    public static void main(String[] args) {

    new Thread(() -> {

    try {

    sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    greeting();

    }).start();Observable.interval(0,1000, TimeUnit.MILLISECONDS).subscribe(aLong -> greeting());}

    public static void greeting(){

    System.out.println("Hello");

    }

    6 timer();

    一个良好的API。在程序中,如果我想在一秒钟后调用某个东西,我可以使用如下所示的定时器。

    public static void main(String[] args) throws InterruptedException {Observable.timer(1, TimeUnit.SECONDS).subscribe(aLong -> greeting());

    Thread.sleep(2000);

    }

    public static void greeting(){

    System.out.println("Hello");

    }

    7. empty():

    虽然被嘲笑但是真的特别有用

    它创造了一个被观察者 并且不发射任何东西

    public static void main(String[] args) throws InterruptedException {

    hey(false).subscribe(o -> System.out.println(o));

    }

    private static Observable hey(boolean isMock) {

    returnisMock?Observable.empty():Observable.just(1, 2, 3, 4);

    }

    7. defer():

    在很多情况下,这是非常有用的。我将用一个例子来解释这个问题,如下所示。

    public static void main(String[] args) throws InterruptedException {

    Employee employee = new Employee();

    employee.name = "Hafiz";employee.age = 27;Observable observable = employee.getObservable();employee.age = 28;observable.subscribe(s-> System.out.println(s));}

    private static class Employee{

    String name;

    int age;

    Observable getObservable(){

    return Observable.just(name, age);

    }

    }

    上述代码的输出将是什么。如果你的答案是28岁,那你就错了。通常被观察的创建方法获取到的值在创建的时候就已经得到了。就像我做输出一样,我将得到27,因为我在27岁的时候创造了一个可观察的结果,之后我改变到28,但是已经可以观察到。那么解决方案是什么呢?是的,您可以使用延迟API。这是真的很有帮助。当你使用延迟的时候基本上只有在你订阅的时候才会出现的情况,所以它的意思是通过使用这个,我将得到我的预期结果。

    Observable getObservable(){

    //return Observable.just(name, age);return Observable.defer(()-> Observable.just(name, age));}

    8error

    对来生成错误信号很有用,在我们讨论观察者和他的方法的时候我在和你分享

    9. never():

    这个api什么都不发送

    me:wow谢谢你rx z这真是一个很棒并且很长的答案,我将把它当作我的一个备忘录 , 你可以吧任何函数转化被观察者

    public static void main(String[] args) throws InterruptedException {

    System.out.println(scale(10,4));Observable.just(scale(10,4)).subscribe(value-> System.out.println(value));}

    private static float scale(int width, int height){

    return width/height*.3f;

    }

    me:哇,你真厉害。现在,我想问你关于map filter,等操作的问题。但是如果你想和我分享关于被观察者的创建。由于缺乏知识,我无法向你请教,请与我分享。

    rx:有很多。但是我想我可以在这里解释两种不同的观测值。一种叫做冷观察,第二种叫做热观察。在寒冷的…

    相关文章

      网友评论

      本文标题:Rxjava2~学渣带你扣rxjava2~ 译文(原创翻译)

      本文链接:https://www.haomeiwen.com/subject/xzcnqxtx.html