Distinct
подавляет дублируемые элементы, испускаемые Observable
Оператор Distinct фильтрует Observable, пропускает только те элементы, которые ещё не были испущены.
В некоторых реализациях существуют варианты, позволяющие настраивать критерии, по которым два элемента считаются «различными». В некоторых реализациях есть вариант оператора, который сравнивает элемент только с его непосредственным предшественником на предмет различия, тем самым отфильтровывая только последовательные дублируемые элементы из последовательности.
См. также
- Filter
- Введение в Rx: Distinct и DistinctUntilChanged
- RxMarbles:
distinct - RxMarbles:
distinctUntilChanged
Сведения о языке
RxGroovy distinct distinctUntilChanged
RxGroovy реализует этот оператор как distinct.
- Javadoc:
distinct()
Также существует вариант этого оператора, который принимает функцию в качестве параметра. Эта функция работает с элементами, испускаемыми источником Observable, для генерации «ключа». Именно эти ключи, а не сами элементы, distinct будут сравнивать, чтобы определить, являются ли два элемента различными.
- Javadoc:
distinct(Func1)
RxGroovy также реализует оператор distinctUntilChanged. Он сравнивает испущенные элементы из исходного Observable только со своими непосредственными предшественниками, чтобы определить, являются ли они различными.
- Javadoc:
distinctUntilChanged()
Как и в случае с distinct, существует также версия distinctUntilChanged, которая принимает функцию выбора ключа и использует полученный ключ для определения того, являются ли два смежных испущенных элемента различными.
- Javadoc:
distinctUntilChanged(Func1)
distinct и distinctUntilChanged по умолчанию не работают с каким-либо конкретным Scheduler.
RxJava 1․x distinct distinctUntilChanged
RxJava реализует этот оператор как distinct.
Пример кода
Observable.just(1, 2, 1, 1, 2, 3)
.distinct()
.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.
- Javadoc:
distinct()
Также существует вариант этого оператора, который принимает функцию в качестве параметра. Эта функция работает с элементами, испускаемыми источником Observable, для генерации «ключа». Именно эти ключи, а не сами элементы, distinct будут сравнивать, чтобы определить, являются ли два элемента различными.
- Javadoc:
distinct(Func1)
RxJava также реализует оператор distinctUntilChanged. Он сравнивает испущенные элементы из исходного Observable только со своими непосредственными предшественниками, чтобы определить, являются ли они различными.
- Javadoc:
distinctUntilChanged()
Как и в случае с distinct, существует также версия distinctUntilChanged, которая принимает функцию выбора ключа и использует полученный ключ для определения того, являются ли два смежных испущенных элемента различными.
- Javadoc:
distinctUntilChanged(Func1)
distinct и distinctUntilChanged по умолчанию не работают с каким-либо конкретным Scheduler.
RxJS distinct distinctUntilChanged
В RxJS оператор distinct имеет два необязательных параметра:
- функция, которая принимает элемент, испущенный источником Observable, и возвращает ключ, который будет использоваться вместо самого элемента при сравнении двух элементов на предмет различия
- функция, которая принимает два элемента (или два ключа) и сравнивает их на предмет различия, возвращая
false, если они различны (функция равенства является значением по умолчанию, если вы не предоставите свою собственную функцию)
Пример кода
/* Without key selector */
var source = Rx.Observable.fromArray([
42, 24, 42, 24
])
.distinct();
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x.toString()); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); });
Next: 42 Next: 24 Completed
/* With key selector */
var source = Rx.Observable.fromArray([
{value: 42}, {value: 24}, {value: 42}, {value: 24}
])
.distinct(function (x) { return x.value; });
var subscription = source.subscribe(
function (x) {
console.log('Next: ' + x.toString());
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
Next: { value: 42 }
Next: { value: 24 }
Completed
RxJS также имеет оператор distinctUntilChanged. Он сравнивает испущенные элементы из исходного Observable только со своими непосредственными предшественниками, чтобы определить, являются ли они различными. Он принимает те же два необязательных параметра, что и оператор distinct.
Пример кода
/* Without key selector */
var source = Rx.Observable.fromArray([
24, 42, 24, 24
])
.distinctUntilChanged();
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); });
Next: 24 Next: 42 Next: 24 Completed
/* With key selector */
var source = Rx.Observable.fromArray([
{value: 24}, {value: 42}, {value: 42}, {value: 24}
])
.distinctUntilChanged(function (x) { return x.value; });
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x.toString()); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); });
Next: { value: 24 }
Next: { value: 42 }
Next: { value: 24 }
Completeddistinct и distinctUntilChanged можно найти в каждом из следующих распределений:
rx.jsrx.all.jsrx.all.compat.jsrx.compat.jsrx.lite.jsrx.lite.compat.js
RxPHP distinct distinctKey distinctUntilChanged distinctUntilKeyChanged
RxPHP реализует этот оператор как distinct.
Возвращает последовательность Observable, содержащую только уникальные элементы в соответствии с keySelector и comparer. Использование этого оператора следует тщательно продумывать из-за поддержки внутренней структуры поиска, которая может увеличиваться.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/distinct/distinct.php
$source = \Rx\Observable::fromArray([
42, 24, 42, 24
])->distinct();
$subscription = $source->subscribe($stdoutObserver);
Next value: 42 Next value: 24 Complete!
RxPHP также имеет оператор distinctKey.
Вариант distinct, который принимает селектор ключа
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/distinct/distinctKey.php
$source = \Rx\Observable::fromArray([
['id' => '42'],
['id' => '24'],
['id' => '42'],
['id' => '24']
])
->distinctKey(function ($x) {
return $x['id'];
})
->map(function ($x) {
return $x['id'];
});
$subscription = $source->subscribe($stdoutObserver);
Next value: 42 Next value: 24 Complete!
RxPHP также имеет оператор distinctUntilChanged.
Вариант distinct, который сравнивает испущенные элементы из исходного Observable только со своими непосредственными предшественниками, чтобы определить, являются ли они различными.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/distinct/distinctUntilChanged.php
$source = \Rx\Observable::fromArray([
24, 42, 24, 24
])->distinctUntilChanged();
$subscription = $source->subscribe($stdoutObserver);
Next value: 24 Next value: 42 Next value: 24 Complete!
RxPHP также имеет оператор distinctUntilKeyChanged.
Вариант distinctUntilChanged, который принимает селектор ключа и компаратор.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/distinct/distinctUntilKeyChanged.php
$source = \Rx\Observable::fromArray([
['id' => '24'],
['id' => '42'],
['id' => '24'],
['id' => '24']
])
->distinctUntilKeyChanged(function ($x) {
return $x['id'];
})
->map(function ($x) {
return $x['id'];
});
$subscription = $source->subscribe($stdoutObserver);
Next value: 24 Next value: 42 Next value: 24 Complete!
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/distinct.html