Фильтр с использованием Single <Boolean> - PullRequest
0 голосов
/ 20 апреля 2019

Я хочу отфильтровать поток (), фильтр должен быть снабжен предикатом, как мне этого добиться с помощью RxJava, я использую Room Persistence Database, я хочу добавить новые поля, если база данных еще не содержит их,Моя проблема связана с методом doDatabaseContainSong ().

Я новичок в RX Java, код представляет собой смесь Kotlin и Java

    // 1. ADD NEW SONGS TO DATABASE
songs.stream()
        .filter(song -> !doesDatabaseContainSong(song, mViewModel))
        .forEach(this::addSongToDatabase);

Мне нужна следующая функция (didDatabaseContainSong)для возврата логического значения вместо него возвращается Single

public static boolean doesDatabaseContainSong(Song song, SongViewModel model) {
    int result = model.doesDatabaseContainSong(song.getId(), Type.GOOGLE_DRIVE.name());
    return result != 0;
}

Модель представления

fun doesDatabaseContainSong(mId: String): Single<Int> {
    return repository.doesDatabaseContainSong(mId)
}

Репозиторий

fun doesDatabaseContainSong(mId: String): Single<Int> {
    return songDao.doesDatabaseContainSong(mId)
}

DAO

@Query("SELECT COUNT(id) from song_table WHERE id = :mId")
fun doesDatabaseContainSong(mId: String): Single<Int>

1 Ответ

1 голос
/ 23 апреля 2019

DAO (измененный тип возврата на Boolean)

@Query("SELECT COUNT(id) from song_table WHERE id = :mId")
fun doesDatabaseContainSong(mId: String): Single<Boolean>

Репозиторий (измененный тип возврата на Boolean)

fun doesDatabaseContainSong(mId: String): Single<Boolean> {
    return songDao.doesDatabaseContainSong(mId)
}

Модель представления (измененный тип возврата на Boolean)

fun doesDatabaseContainSong(mId: String): Single<Boolean> {
    return repository.doesDatabaseContainSong(mId)
}

(изменен тип возвращаемого значения на Boolean)

public static Single<Boolean> doesDatabaseContainSong(Song song, SongViewModel model) {
    return model.doesDatabaseContainSong(song.getId(), Type.GOOGLE_DRIVE.name());
}

Теперь окончательный код:

songs
    .stream()
    .flatMap(doesContainSong -> doesDatabaseContainSong(song, mViewModel))
    .filter(doesContainSong -> !doesContainSong)
    .forEach(this::addSongToDatabase);

Надеюсь, это поможет.

...