목차
버퍼 - 전송된 여러 데이터를 n개의 대기열로 전송된 데이터로 변환합니다. 각 대기열의 최대 길이는 매개변수 크기입니다. buffer() 함수에 의해 지정됩니다.
그러면 처음으로 2개의 목록 데이터가 전송됩니다.
출력:
4.FlatMap
따라서 코드는 다음과 같습니다.
5.GroupBy
RxJava는 이를 다음과 같이 변환합니다.
Min 연산자는 숫자 값을 내보내고 단일 값: 가장 작은 값을 내보내는 Observable에서 작동합니다. .
9.Count
10.Sum
Java java지도 시간 RxJava_05 [변환 연산 및 수학적 연산] 코드에 대한 자세한 소개

RxJava_05 [변환 연산 및 수학적 연산] 코드에 대한 자세한 소개

Mar 04, 2017 am 09:54 AM

이 튜토리얼은 RxJava1을 기반으로 합니다. > 관찰자와 관찰자 사이에서 일부 전송된 데이터를 사용하려면 먼저 변환해야 합니다. 학교의 특정 학급에 있는 학생들의 중국어 점수 순위를 알아야 합니다. 이를 위해서는 ArrayList를 ArrayList 대기열로 변환해야 합니다. 다음은 일련의 데이터 전환 연산자를 제공합니다.

버퍼 - 전송된 여러 데이터를 n개의 대기열로 전송된 데이터로 변환합니다. 각 대기열의 최대 길이는 매개변수 크기입니다. buffer() 함수에 의해 지정됩니다.

    Window - 주기적으로 원본 Observable의 데이터를 Observable 창으로 나눕니다.
  1. Map - 전송된 데이터를 분할합니다. 특정 다른 데이터로 변환

  2. flatMap - 실제로 전송된 한 유형의 데이터를 다른 데이터 유형의 객체로 변환합니다

  3. GroupBy - 지정된 키에 따라 동일한 유형의 전송된 데이터를 n개의 하위 Observable에 저장합니다.

  4. Scan - 전송된 모든 데이터에 대해 함수를 실행하고 n번째 및 n+1 항목을 계산한 다음 n+2 항목으로 계산된 결과를 실행합니다.
  5. 1.Buffer
  6. 예를 들어 다음 데이터에서는 각각 3개의 문자열이 전송됩니다.

    Observable.just("Hello Android !", "Hello Java", "Hello C");
    로그인 후 복사
  7. 옵저버 뒤에 버퍼 연산을 추가하면 기호를 사용하고 캐시 2개 항목을 지정하면 코드는 다음과 같습니다:
final Observable observable = Observable.just("Hello Android !", "Hello Java", "Hello C");
Observable> bufferObservable = observable.buffer(2);
로그인 후 복사

그러면 처음으로 2개의 목록 데이터가 전송됩니다.

List<String>(){"Hello Android !", "Hello Java"}
List<String>(){"Hello C"}
로그인 후 복사

아래 전체 샘플 코드는 다음과 같습니다. 다음:

//这里模拟正常发送三个单一值的被观察者
final Observable observable = Observable.just("Hello Android !", "Hello Java", "Hello C");
//定义一个缓存的被观察者 每次缓存2个 缓存的数据自上面observable对象获取
Observable> bufferObservable = observable.buffer(2);
//订阅对象并获取缓存被观察者发送出来的数据
bufferObservable.subscribe(new Action1>() {
    @Override
    public void call(List strings) {
        Log.i(TAG, "call:--------");
        for (int i = 0; i < strings.size(); i++) {
            Log.i(TAG, "call: "+strings.get(i));
        }
    }
});
로그인 후 복사

Output

call:--------
call: Hello Android !
call: Hello Java
call:--------
call: Hello C
로그인 후 복사

buffer()는 실제로 전송된 n 데이터를 x 대기열로 변환합니다

2.Window

주기적으로 원본 Observable의 데이터를 Observable 창으로 나누고 한 번에 한 조각의 데이터를 내보내는 대신 이러한 창을 내보냅니다. Window는 Buffer와 유사하지만 원본 Observable에서 데이터 패킷을 내보내는 대신 Emit은 Observable이며, 각 Observable은 원래 Observable 데이터의 하위 집합을 내보내고 마지막으로 onCompleted 알림을 내보냅니다.

Observable.just(1, 2, 3, 4, 5)
//将一个Observable发射出去的数据分解为多个Observable对象 每个Observable发射2个数据
            .window(2)
            .subscribe(new Action1<Observable<Integer>>() {
                @Override
                public void call(Observable<Integer> innerObservable) {
                    Log.i(TAG, "call: ---------");
                    innerObservable.subscribe(new Action1<Integer>() {
                        @Override
                        public void call(Integer value) {
                            Log.i(TAG, "call: "+value);
                        }
                    });
                }
            });
로그인 후 복사

출력:

 call: ---------
 call: 1
 call: 2
 call: ---------
 call: 3
 call: 4
 call: ---------
 call: 5
로그인 후 복사

3.Map

신입생 체크인. 데이터 입력 중 Zhang San의 이름이 잘못 입력된 것으로 확인되어 Zhang Sanfeng으로 변경해야 합니다. 이제 그에 대한 정보를 다시 입력해야 합니다. 코드는 다음과 같습니다.

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

ArrayList<Student> students = initPersons();
for (int i = 0; i < students.size(); i++) {
    Student student = students.get(i);
    if (student.name.equals("张三")){
        student.name="张三丰";
    }
}
로그인 후 복사

RxJava는 이를 다음과 같이 변환합니다.

Observable.from(initPersons())
            //将张三的名字改为张三丰
            .map(new Func1<Student, Student>() {
                @Override
                public Student call(Student student) {
                     //循环检查每个学生的名字,如果找到张三 则改为张三丰
                    if (student.name.equals("张三")){
                        student.name="张三丰";
                    }
                    return student;
                }
            })
            .subscribe(new Action1<Student>() {
                @Override
                public void call(Student student) {
                    Log.i(TAG, "call: "+student);
                }
            });
로그인 후 복사

map()은 실제로 전송된 특정 데이터를 다른 데이터로 변환합니다.

4.FlatMap

오늘 학교에서 체조팀을 결성했습니다. 학교에서는 몇 명의 학생을 더 모집했는데 코드는 다음과 같습니다. rree 상사는 체조를 어릴 때부터 배워야 한다고 요구했습니다. 15세 미만의 학생을 찾아 체조 팀을 구성하고, 초등학생을 위한 특정 그룹입니다.

private ArrayList<Student> initStudents() {
    ArrayList<Student> persons = new ArrayList<>();
    persons.add(new Student("张三", 11));
    persons.add(new Student("李四", 12));
    persons.add(new Student("王二麻子", 13));
    persons.add(new Student("李雷", 19));
    persons.add(new Student("韩梅梅", 18));
    persons.add(new Student("韩红", 17));
    return persons;
}
로그인 후 복사

따라서 코드는 다음과 같습니다.

public static class LittleStudent extends Student{

    public LittleStudent(String name, int age) {
        super(name, age);
    }
}
로그인 후 복사

RxJava는 이를 다음과 같이 변환합니다.

ArrayList<Student> students = initStudents();

//封装小学生集合
ArrayList<LittleStudent> littleStudents=new ArrayList<>();
for (int i = 0; i < students.size(); i++) {
    Student student = students.get(i);
    if (student.age<15){
        littleStudents.add(new LittleStudent(student.name,student.age));
    }
}
로그인 후 복사

flatMap()은 실제로 전송된 한 유형의 데이터를 다른 데이터로 변환합니다.

5.GroupBy

유형의 객체는 Observable을 Observable 컬렉션으로 분할하며, 각 Observable은 원래 Observable의 하위 시퀀스를 방출합니다. Observable이 어떤 데이터 항목을 내보낼지는 groupBy 내부 함수에 의해 결정됩니다. 이 함수는 각 항목에 Key를 할당하며 동일한 Observable에서 내보내집니다. 이는 Observable의 특수 하위 클래스인 GroupedObservable을 반환합니다. GroupedObservable 인터페이스를 구현하는 객체에는 getKey라는 추가 메서드가 있습니다. 이 키는 데이터를 지정된 Observable로 그룹화하는 데 사용됩니다.

Observable.from(initStudents())
            .flatMap(new Func1<Student, Observable<LittleStudent>>() {
                @Override
                public Observable<LittleStudent> call(Student student) {
                    if (student.age<15){
                        return Observable.just(new LittleStudent(student.name,student.age));
                    }
                    return null;
                }
            })
            .subscribe(new Action1<LittleStudent>() {
                @Override
                public void call(LittleStudent littleStudent) {
                    Log.i(TAG, "call: "+littleStudent);
                }
            });
로그인 후 복사
분류 호출 구현

//模拟学校录入的一系列的同名学生信息
private Observable<Person> getPersons(){
    return Observable.from(new Person[]{
            new Person("zhangsan",18),
            new Person("zhangsan",20),
            new Person("lisi",19),
            new Person("lisi",33),
            new Person("wangwu",20),
            new Person("wangwu",22),
            new Person("wangwu",21)
    });
}
로그인 후 복사

지정된 키에 따라 동일한 유형의 전송 데이터를 n개의 하위 Observable에 저장

6.Scan

Scan 연산자는 원본 Observable이 내보낸 첫 번째 항목에 함수를 적용한 다음 해당 함수의 결과를 자체 첫 번째 항목으로 내보냅니다. 두 번째 데이터와 함께 함수의 결과를 함수에 공급하여 자체 두 번째 데이터를 생성합니다. 이 프로세스를 계속하여 나머지 데이터 시퀀스를 생성합니다. 어떤 경우에는 이 연산자를 누산기라고 합니다. 예를 들어 1에서 5까지 더하려는 경우 아이디어는 다음과 같습니다.

final Observable<GroupedObservable<String, Person>> observable = getPersons()
        //根据用户的名称来归类
        .groupBy(new Func1<Person, String>() {
            @Override
            public String call(Person person) {
                return person.name;
            }
        });
observable.subscribe(new Action1<GroupedObservable<String, Person>>() {
    //每归一类 则调用一次该方法
    @Override
    public void call(GroupedObservable<String, Person> observablelist) {
        Log.i(TAG, "call: ----"+observablelist.getKey());
        //打印队列中的每个元素
        observablelist.subscribe(new Action1<Person>() {
            @Override
            public void call(Person person) {
                Log.i(TAG, "call: "+person.name+"  "+person.age);
            }
        });

    }
});
로그인 후 복사

RxJava는 이를 다음과 같이 변환합니다.

 1+2=3;
 3+3=6;
 6+4=10;
10+5=15;
로그인 후 복사

출력

//实现从1加到5的总数
Observable.just(1, 2, 3, 4, 5)
    .scan(new Func2<Integer, Integer, Integer>() {
        //定义每个子项的合并规则
        @Override
        public Integer call(Integer sum, Integer item) {
            return sum + item;
        }
    })
    .subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer result) {
            Log.i(TAG, "call: " + result);
        }
    });
로그인 후 복사

예 전송된 모든 데이터는 특정 기능을 통해 실행되며, n번째 및 n+1번째 항목이 계산된 후 n+2번째 항목으로 실행됩니다.

개발 과정에서 평균/합계/최대값 및 최소값/큐 획득 횟수 등을 계산하는 등 몇 가지 일반적인 수학적 계산이 불가피하게 사용됩니다.

수학적 계산과 관련하여 RxJava는 여기서 종속성 패키지를 제공합니다. 다운로드 주소는 RxJavaMath

개발 패키지는 핵심 도우미 클래스를 제공합니다:
MathObservable

7.Average

대기열 번호의 평균 찾기, 이 큐는 int 유형 또는 double 유형 등일 수 있습니다. 다음 예는 1에서 6까지의 평균을 계산합니다.

Next: 1
Next: 3
Next: 6
Next: 10
Next: 15
Sequence complete.
로그인 후 복사
8.Max/Min

Min 연산자는 숫자 값을 내보내고 단일 값: 가장 작은 값을 내보내는 Observable에서 작동합니다. .

Max 연산자는 값을 방출하고 단일 값, 즉 가장 큰 값을 방출하는 Observable에서 작동합니다.

以下例子列出1到6的最小值:

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

o1.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer integer) {
        Log.i(TAG, "call: "+integer);
    }
});
로그인 후 복사

以下例子列出1到6的最大值:

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

o1.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer integer) {
        Log.i(TAG, "call: "+integer);
    }
});
로그인 후 복사

9.Count

count函数主要列出发送队列的个数。

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

count.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer integer) {
            //打印出6
        Log.i(TAG, "call: "+integer);
    }
});
로그인 후 복사

10.Sum

计算Observable发射的数值的和并发射这个和.

RxJava的实现是sumDouble, sumFloat, sumInteger, sumLong,它们不是RxJava核心模块的一部分,属于rxjava-math模块。你可以使用一个函数,计算Observable每一项数据的函数返回值的和。

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

o1.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer integer) {
        Log.i(TAG, "call: "+integer);
    }
});
로그인 후 복사

 以上就是深入浅出RxJava_05[转换操作&数学运算]的代码详细介绍的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

자바의 제곱근 자바의 제곱근 Aug 30, 2024 pm 04:26 PM

자바의 제곱근 안내 여기서는 예제와 코드 구현을 통해 Java에서 Square Root가 어떻게 작동하는지 설명합니다.

자바의 완전수 자바의 완전수 Aug 30, 2024 pm 04:28 PM

Java의 완전수 가이드. 여기서는 정의, Java에서 완전 숫자를 확인하는 방법, 코드 구현 예제에 대해 논의합니다.

Java의 난수 생성기 Java의 난수 생성기 Aug 30, 2024 pm 04:27 PM

Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

자바의 웨카 자바의 웨카 Aug 30, 2024 pm 04:28 PM

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

자바의 암스트롱 번호 자바의 암스트롱 번호 Aug 30, 2024 pm 04:26 PM

자바의 암스트롱 번호 안내 여기에서는 일부 코드와 함께 Java의 Armstrong 번호에 대한 소개를 논의합니다.

Java의 스미스 번호 Java의 스미스 번호 Aug 30, 2024 pm 04:28 PM

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

Java Spring 인터뷰 질문 Java Spring 인터뷰 질문 Aug 30, 2024 pm 04:29 PM

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Feb 07, 2025 pm 12:09 PM

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

See all articles