이 튜토리얼은 RxJava1을 기반으로 합니다. >관찰자가 관찰자에게 데이터를 보낼 때 데이터 전송 중에 데이터를 추가로 필터링해야 할 수도 있습니다. 다음 튜토리얼에서는 대부분의 필터링 작업에 대한 기능을 다룹니다.
고유 - 전송된 중복 데이터 제거
이제 수업이 있고, 학생 정보가 학생 시스템에 입력되었습니다. 동일한 데이터가 반복되는 것으로 나타났습니다. 학생 데이터 대기열은 다음과 같습니다.
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; }
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='张三', age=16} IT520: call: Student{name='李四', age=17} IT520: call: Student{name='王二麻子', 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."); } });
Next: 1 Sequence complete.
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.
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); } });
com.m520it.rxjava I/IT520: call: 4
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."); } });
Next: 1 Next: 2 Next: 3 Next: 4 Sequence complete.
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.
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); } });
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); } });