>Java >java지도 시간 >RxJava_06 [전송 프로세스의 조건 및 조합 연산] 내용에 대한 심층 설명

RxJava_06 [전송 프로세스의 조건 및 조합 연산] 내용에 대한 심층 설명

黄舟
黄舟원래의
2017-03-04 09:58:121465검색


이 튜토리얼은 RxJava1을 기반으로 합니다. >다음 일련의 함수는 전송된 데이터가 충족되는지 확인하는 데 사용됩니다. 특정 조건.

all - Observable에서 방출된 모든 데이터가 특정 조건을 충족하는지 확인합니다. 원본 Observable의 데이터가 조건을 충족하지 않으면 False가 반환됩니다.
  1. Amb - 2개의 Observable이 주어지면 데이터를 먼저 보내는 Observable만 전송되고 후자는 무시됩니다.
  2. Contains - Observable이 특정 값을 방출하는지 여부를 결정합니다.
  3. DefaultIfEmpty - 원래 Observable이 방출하지 않은 경우 원래 Observable에서 값을 방출합니다. 모든 값, 기본값 방출
  4. SequenceEqual - 두 Observable이 동일한 데이터 시퀀스를 방출하는지 확인
  5. SkipUntil - SkipUntil은 원래 Observable을 구독합니다. , 그러나 이미터를 무시합니다. 두 번째 Observable이 항목을 방출하는 순간까지 원래 Observable을 방출하기 시작합니다.
  6. SkipWhile - SkipWhile은 원래 Observable을 구독하지만 이미터를 무시합니다. 지정한 특정 조건이 거짓이 되는 순간, 원래 Observable을 방출하기 시작합니다.
  7. TakeUntil - 두 번째 Observable 대신 조건자 함수를 사용하여 내보낸 데이터를 종료해야 하는지 여부를 결정합니다. takeWhile과 유사하게 동작합니다.
  8. TakeWhile - TakeWhile은 지정한 특정 조건이 true가 아닐 때까지 원본 Observable을 방출합니다. 이 시점에서 원본 Observable 방출을 중지하고 자체 Observable을 종료합니다.
  9. 1.all
Observable이 내보낸 모든 데이터가 특정 조건을 충족하는지 확인합니다. 원본 Observable의 데이터 중 조건을 충족하지 않는 경우 거짓

그룹 학생 정보가 있는 경우 데이터는 다음과 같습니다.

rree

학교에 등록할 때 20세 이하여야 공부할 수 있습니다. 방법은 all 함수를 사용하여 판단할 수 있습니다.

private ArrayList<Student> initStudents() {
    ArrayList<Student> persons = new ArrayList<>();
    persons.add(new Student("张三", 16));
    persons.add(new Student("李四", 21));
    persons.add(new Student("王二麻子", 18));
    return persons;
}

2.Amb

두 개 이상의 Observable이 있으면 처음으로 데이터를 내보내거나 알리는 Observable의 모든 데이터만 내보내고 Amb는 다른 모든 Observable의 방출을 무시하고 삭제합니다. 것들.

Observable<Student> observable = Observable.from(initStudents());
Observable<Boolean> booleanObservable = 
                observable.all(new Func1<Student, Boolean>() {
                    //设置判断规则
                    @Override
                    public Boolean call(Student student) {
                        return student.age<20;
                    }
                });
booleanObservable.subscribe(new Action1<Boolean>() {
    @Override
    public void call(Boolean aBoolean) {
        //这里打印了false  因为学生里面李四21岁
        Log.i(TAG, "call: "+aBoolean);
    }
});

3.Contains

원래 Observable이 해당 값을 내보내면 반환되는 Observable은 true를 내보내고, 그렇지 않으면 false를 내보냅니다.

Observable<String> o1 = Observable.just("a", "b", "c");
Observable<String> o2 = Observable.just("d", "f", "e");

//判断上面的2个被观察者对象哪个先发送数据 发送数据慢的被观察者将被忽略
Observable<String> observable = Observable.amb(o2,o1);

observable.subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
        Log.i(TAG, "call: "+s);
    }
});

4.DefaultIfEmpty

DefaultIfEmpty는 원래 Observable의 값을 정확하게 내보냅니다. 원래 Observable이 데이터를 내보내지 않고 정상적으로(onCompletedd 형식으로) 종료되면 Observable이 반환됩니다. by DefaultIfEmpty는 사용자가 제공한 기본값을 내보냅니다.

Observable<String> o1 = Observable.just("a", "b", "c");
Observable<Boolean> observable = o1.contains("a");

observable.subscribe(new Action1<Boolean>() {
    @Override
    public void call(Boolean aBoolean) {
        //true
        Log.i(TAG, "call: "+aBoolean);
    }
}

예를 들어 관찰자가 네트워크 요청에 접근하면 백그라운드 서버는 반환 데이터를 반환하지 않고 대신 기본 데이터를 사용할 수 있습니다.

5.SequenceEqual

두 Observable이 동일한 데이터 시퀀스를 내보내는지 여부를 결정합니다. 두 Observable이 동일한 경우(동일한 데이터, 동일한 순서, 동일한 종료 상태), true를 내보내고, 그렇지 않으면 false를 방출합니다.

Observable<String> o1 = Observable
        .create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                //这里没有发送任何onNext事件,而是调用onCompleted()事件
                subscriber.onCompleted();
            }
        });
    //如果上面的o1不发送任何onNext而结束 则发送一个默认的值d
    Observable<String> o2 = o1.defaultIfEmpty("d");
    o2.subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            //打印d
            Log.i(TAG, "call: "+s);
        }
    });

6.1 SkipUntil

SkipUntil은 원본 Observable을 구독하지만 두 번째 Observable이 원본 Observable을 방출하기 시작할 때 데이터 항목을 방출할 때까지 해당 방출자를 무시합니다.

Observable<Integer> o1 = Observable.just(1,2,3);
Observable<Integer> o2 = Observable.just(1,2,3);
Observable<Boolean> observable = Observable.sequenceEqual(o1, o2);

observable.subscribe(new Action1<Boolean>() {
    @Override
    public void call(Boolean aBoolean) {
        Log.i(TAG, "call: "+aBoolean);
    }
});

출력:

Observable<Integer> o1 = Observable.just(1,2,3);
Observable<Integer> o2 = o1.skipUntil(Observable.create(new Observable.OnSubscribe<Integer>() {
    @Override
    public void call(Subscriber<? super Integer> subscriber) {
        //如果不发送如下信息  则上面的1,2,3都不会发送
        //如果发送了4 则直接发送1,2,3 但是4 5并没有发送
        subscriber.onNext(4);
        subscriber.onNext(5);
    }
}));

o2.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer value) {
        Log.i(TAG, "call: "+value);
    }
});

6.2 SkipUntil

SkipWhile은 원래 Observable을 구독하지만 지정한 조건이 false가 되는 순간까지 이미터를 무시하여 원본을 방출하기 시작합니다. 주목할 만한.

call: 1
call: 2
call: 3

출력:

Observable<Integer> o1 = Observable.just(1,2,3,4,5,6);
Observable<Integer> o2 = o1.skipWhile(new Func1<Integer, Boolean>() {
    @Override
    public Boolean call(Integer value) {
        //直到发送的数据"等于"4 才开始从4发送数据 这里打印4,5,6
        return value!=4;
    }
});

o2.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer value) {
        Log.i(TAG, "call: "+value);
    }
});

7.1 TakeUntil

takeUntil 내부 함수를 사용하여 후속 데이터를 종료하고 계속 전송할지 여부를 결정합니다. 코드는 다음과 같습니다:

call: 4
call: 5
call: 6

위 코드는 다음과 유사합니다:

Observable<Integer> o1 = Observable.just(1,2,3,4,5,6);
Observable<Integer> o2 = o1.takeUntil(new Func1<Integer, Boolean>() {
    @Override
    public Boolean call(Integer value) {
        //发送数据直到等于4才停止发送
        return value==4;
    }
});

o2.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer value) {
        Log.i(TAG, "call: "+value);
    }
});

7.2 TakeWhile

TakeWhile은 지정한 특정 조건이 충족되는 순간까지 원본 Observable을 내보냅니다. 보유하지 않으면 원래 Observable을 방출하고 자체 Observable을 종료합니다.

ArrayList<Integer> datas=new ArrayList<>();
for (int i = 1; i <= 6 ; i++) {
    datas.add(i);
}
int index=0;
while(datas.get(index)<=4){
    Log.i(TAG, "onCreate: "+datas.get(index));
    index++;
}

위 코드는 다음 while 문과 비슷하게 1~4를 출력합니다.

Observable<Integer> o1 = Observable.just(1,2,3,4,5,6);
Observable<Integer> o2 = o1.takeWhile(new Func1<Integer, Boolean>() {
    @Override
    public Boolean call(Integer integer) {
        //发送数据 直到发送的数据等于才停止发送
        return integer!=5;
    }
});

o2.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer value) {
        Log.i(TAG, "call: "+value);
    }
});

아래 표시된 함수는 여러 Observable을 결합하는 데 사용할 수 있습니다.


Merge - 여러 Observable의 방출을 인터리브 병합
  1. StartWith - 데이터 시퀀스의 시작 부분에 지정된 항목을 삽입합니다.
  2. Zip - 함수에서 제공하는 규칙에 따라 두 관측 가능 항목의 배출 데이터를 병합합니다. 총 배출 데이터 수는 관측 가능한 최소 배출 수를 기준으로 합니다.
  3. 8.Merge
여러 Observable의 방출을 병합합니다. Merge 연산자를 사용하면 여러 Observable의 출력을 마치 단일 Observable인 것처럼 병합할 수 있습니다.

병합으로 인해 병합된 Observable이 내보낸 데이터가 인터리브될 수 있습니다(데이터를 인터리브하지 않는 유사한 연산자 Concat이 있으며 여러 Observable을 순서대로 내보냅니다).

예제 코드

ArrayList<Integer> datas=new ArrayList<>();
for (int i = 1; i <= 6 ; i++) {
    datas.add(i);
}
int index=0;
while(datas.get(index)!=5){
    Log.i(TAG, "onCreate: "+datas.get(index));
    index++;
}

Output

Observable<Integer> odds = Observable.just(1, 3, 5).subscribeOn(someScheduler);
Observable<Integer> evens = Observable.just(2, 4, 6);

Observable.merge(odds, evens)
          .subscribe(new Subscriber<Integer>() {
        @Override
        public void onNext(Integer item) {
            System.out.println("Next: " + item);
        }

        @Override
        public void onError(Throwable error) {
            System.err.println("Error: " + error.getMessage());
        }

        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }
    });

9.StartWith

데이터 시퀀스의 시작 부분에 지정된 항목을 삽입

If Observable이 데이터를 방출하기 전에 지정된 데이터 시퀀스를 방출하도록 하려면 StartWith 연산자를 사용할 수 있습니다. (Observable이 내보낸 데이터 끝에 데이터 시퀀스를 추가하려면 Concat 연산자를 사용할 수 있습니다.)

Observable<String> o1 = Observable.just("模拟网络请求");
Observable<String> o2 = o1.startWith("网络请求之前的准备工作");
o2.subscribe(new Action1<String>() {
    @Override
    public void call(String value) {
        Log.i(TAG, value);
    }
});

输出:

网络请求之前的准备工作
模拟网络请求

类似的函数有:

  • Javadoc: startWith(Iterable))

  • Javadoc: startWith(T)) (最多接受九个参数)

  • Javadoc: startWith(Observable))

10.Zip

假设被观察者o1发送的数据为1 2 ,被观察者o2发送的数据为3,4,5。那么zip压缩发送的数据个数以最低个也就是2个为准。并且 新发送的每个数据以Func2的返回数据为准。

  • Javadoc: zip(Observable1,Observable2,Func2));

示例代码如下:

Observable<Integer> o1 = Observable.just(1,2);
Observable<Integer> o2 = Observable.just(3,4,5);

Observable<Integer> zipObservable = Observable
        .zip(o1, o2, new Func2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer o, Integer o2) {
                return o + o2;
            }
        });

zipObservable.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer s) {
        Log.i(TAG, "call: "+s);
    }
});

输出如下:

call: 4 // 1+3
call: 6   // 2+4


 以上就是深入浅出RxJava_06[传输过程的条件&组合操作]的详情的内容,更多相关内容请关注PHP中文网(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.