>Java >java지도 시간 >RxJava_04 [데이터 전송 필터링 작업] 기술에 대한 심층 설명

RxJava_04 [데이터 전송 필터링 작업] 기술에 대한 심층 설명

黄舟
黄舟원래의
2017-03-04 09:49:101593검색

이 튜토리얼은 RxJava1을 기반으로 합니다. >관찰자가 관찰자에게 데이터를 보낼 때 데이터 전송 중에 데이터를 추가로 필터링해야 할 수도 있습니다. 다음 튜토리얼에서는 대부분의 필터링 작업에 대한 기능을 다룹니다.
고유 - 전송된 중복 데이터 제거

    필터 - 조건에 따라 특정 데이터 필터링
  1. First - 전송 큐의 첫 번째 데이터 가져오기
  2. Last - 전송 큐의 마지막 데이터 가져오기
  3. ElementAt - 인덱스에 따라 대기열의 특정 데이터 보내기
  4. Take - 대기열에 있는 데이터의 처음 n 항목 가져오기
  5. TakeLast - 대기열의 마지막 n 항목 가져오기 data in the queue
  6. Sample - 보낸 데이터를 기준으로 시간 샘플을 전송하여 보냅니다.
  7. IgnoreElements - 보낸 데이터 대기열을 무시합니다.
  8. 1.Distinct
  9. 이제 수업이 있고, 학생 정보가 학생 시스템에 입력되었습니다. 동일한 데이터가 반복되는 것으로 나타났습니다. 학생 데이터 대기열은 다음과 같습니다.

    private ArrayList<Student> initPersons() {
        ArrayList<Student> persons = new ArrayList<>();
        persons.add(new Student("张三", 16));
        persons.add(new Student("李四", 17));
        persons.add(new Student("王二麻子", 18));
        persons.add(new Student("张三", 22));
        return persons;
    }
  10. 현재 필요한 것은 이름이 중복된 개체를 가로채는 것입니다. 그리고 인쇄하세요:
Observable
    .from(initPersons())
    //过滤重复名字的项
    .distinct(new Func1<Student, String>() {
        @Override
        public String call(Student student) {
            return student.name;
        }
    })
    .subscribe(new Action1<Student>() {
        @Override
        public void call(Student student) {
            Log.i(TAG, "call: "+student);
        }
    });

출력은 다음과 같습니다:

IT520: call: Student{name=&#39;张三&#39;, age=16}
IT520: call: Student{name=&#39;李四&#39;, age=17}
IT520: call: Student{name=&#39;王二麻子&#39;, age=18}

2.Filter

전달된 데이터에서 반복되는 부분을 필터링하는 것 외에도 다음과 같은 작업을 수행할 수 있습니다. 필터를 사용하여 규칙에 따라 특정 부분을 지울 수 있습니다.

다음 코드에서 보낸 데이터는 12345입니다. 필터링 규칙은 데이터 막대가 4보다 작아야 한다는 것입니다. 샘플 코드는 다음과 같습니다.

Observable.just(1, 2, 3, 4, 5)
      .filter(new Func1<Integer, Boolean>() {
          @Override
          public Boolean call(Integer item) {
            return( item < 4 );
          }
      })
      .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.");
            }
        });

출력

Next: 1
Next: 2
Next: 3
Sequence complete.

3.첫 번째

전송된 데이터 대기열이 첫 번째 항목만 보내도록 하려면 이 함수를 호출하세요.

샘플 코드

Observable.just(1, 2, 3)
      .first()
      .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.");
    }
});

Output

Next: 1
Sequence complete.

이 함수는 대기열에 보내는 과정에서 사용됩니다. null인 경우 첫 번째 항목에 도달하지 못한 경우 기본값이 전송됩니다.

4.Last

전송된 데이터 큐의 마지막 항목만 전송하려면 이 함수를 호출하세요. 샘플 코드

Observable.just(1, 2, 3)
      .last()
      .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.");
    }
});

출력

Next: 3
Sequence complete.

유사 함수에는 lastOrDefault(T)

5.ElementAt

ElementAt 연산자는 원본 Observable이 내보낸 데이터 시퀀스의 지정된 인덱스 위치에서 데이터 항목을 얻은 다음 이를 고유한 데이터로 내보냅니다.

음수를 전달하거나 원본 Observable의 데이터 항목 수가 index+1보다 적으면 IndexOutOfBoundsException이 발생합니다.

샘플 코드는 다음과 같습니다:

Observable.just(1, 2, 3, 4, 1, 4)
    .elementAt(3)
    .subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer value) {
            Log.i(TAG, "call: " + value);
        }
    });

Output

com.m520it.rxjava I/IT520: call: 4

6.Take

Take 연산자를 사용하면 Observable의 동작을 수정할 수 있습니다. 이전 N개의 데이터만 반환하고 나머지 데이터는 무시하고 완료 알림을 전송합니다.

예제 코드

Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
      .take(4)
      .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.");
            }
        });

Output

Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.

7.TakeLast

원래 Observable을 수정하려면 TakeLast 연산자를 사용하세요. Observable의 방출 항목 데이터, 이전 데이터를 무시합니다.

샘플 코드

Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
      .takeLast(4)
      .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.");
            }
        });

출력

Next: 5
Next: 6
Next: 7
Next: 8
Sequence complete.

8.Sample

전송된 데이터를 특정 주파수로 샘플링하여 전송

Observable
        .interval(1000, TimeUnit.MILLISECONDS)//每秒发送1个数字
        .sample(2000,TimeUnit.MILLISECONDS)//每2秒采样一次
        .subscribe(new Action1<Long>() {
            @Override
            public void call(Long aLong) {
                Log.i(TAG, "call: "+aLong);
            }
        });

위의 코드는 0, 2, 4, 6, 8을 인쇄합니다. . . .

9.IgnoreElements

Observable이 내보낸 데이터에 관심이 없지만 Observable이 완료되거나 오류로 종료될 때 알림을 받고 싶다면, Observable은 관찰자의 onNext() 메소드가 절대 호출되지 않도록 보장합니다.

Observable.just(1, 2, 3, 4, 1)
            .ignoreElements()//不发送任何信息 直接发送onCompleted()
            .subscribe(new Subscriber<Integer>() {
                @Override
                public void onCompleted() {
                    Log.i(TAG, "onCompleted: ");
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(Integer integer) {
                    Log.i(TAG, "onNext: "+integer);
                }
            });

위 내용은 RxJava_04 [데이터 전송 필터링 연산] 기술에 대한 심층 소개입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

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