• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Porównanie Flow<Long> do Long

Aruba Cloud - Virtual Private Server VPS
+1 głos
191 wizyt
pytanie zadane 18 marca 2024 w Android, Swift, Symbian przez MichaelM Bywalec (2,910 p.)

Cześć,

tworzę aplikację i właśnie dodałem bazy danych Room. Muszę porównać datę z bazy danych typu Long z datą obecną, też typu Long. Problem w tym, że gdy daje zapytanie o wyjęciu ostatniego rekordu w bazie:
 

@Query("SELECT dateOfEmotion FROM user_mood " +
            "ORDER BY id DESC " +
            "LIMIT 1;")
fun getLast(): Flow<Long>

A to kod który przechowuje zmienne, które będą porównane:
 

val today = System.currentTimeMillis() //Typ Long
val lastRecord = viewModel.getLast() //Typ Flow<Long>

Problemem jest typ danych Flow<Long>. Jak mogę porównać te dwie zmienne?

1 odpowiedź

+1 głos
odpowiedź 18 marca 2024 przez Wiciorny Ekspert (280,470 p.)
wybrane 18 marca 2024 przez MichaelM
 
Najlepsza

Flow to nie jest typ, a wraper obiektowy dla danego typu, który w skazuje, że dane te są strumieniem (tak naprawdę jest rodzajem sekwencji danych asynchronicznych emitowanych przez producenta ). 
W przeciwieństwie do "Long", który jest typem danych prymitywnych, "Flow<Long>" reprezentuje strumień danych typu Long,
i to jeszcze asynchroniczny, zależy od języka, nie wiem czy piszesz w Javie, Kotlinie czy Swift - to należy najpierw zasubskrybować do danych i sprawdzić czy one istnieja, po subskrybcji - tak naprawdę dysponujesz konkretnym typem.

KOTLIN:

 runBlocking(() -> {
     
            lastRecord.collect(lastRecordValue -> {
                if (lastRecordValue == today) {
                    System.out.println("Wartość emitowana przez strumień jest równa wartości today.");
                } else {
                    System.out.println("Wartość emitowana przez strumień nie jest równa wartości today.");
                }
            });

W javie musisz miec subskrybcje w inny sposób 

https://www.baeldung.com/java-9-reactive-streams

import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;
import java.util.concurrent.TimeUnit;

public class ExampleClass {

    public static void main(String[] args) throws InterruptedException {
        long currentTime = System.currentTimeMillis();

        SubmissionPublisher<Long> publisher = new SubmissionPublisher<>();

        publisher.submit(System.currentTimeMillis());

        publisher.consume(value -> {
            if (value == currentTime) {
                System.out.println("The value from the Flow<Long> is equal to the current time.");
            } else {
                System.out.println("The value from the Flow<Long> is not equal to the current time.");
            }
        });
        TimeUnit.SECONDS.sleep(1);
        publisher.close();
    }
}

Prościej?
Po prostu możesz na obiekcie Flow<Long> wywołać  subscribe... 
 

 // Subskrybujemy się do strumienia
        lastRecord.subscribe(new Flow.Subscriber<Long>() {
            @Override
            public void onSubscribe(Flow.Subscription subscription) {
                subscription.request(1);
            }

            @Override
            public void onNext(Long value) {
                // Obsługujemy wartości emitowane przez strumień
                if (value == currentTime) {
                   // tutaj cos wykonujesz i porównać możesz po prostu gdyz juz masz 
                 // doczynienia z wartoscią obiektu FLOW
                }
         }

            @Override
            public void onError(Throwable throwable) {
                throwable.printStackTrace();
            }

            @Override
            public void onComplete() {
                System.out.println("Subscription completed.");
            }
        });

 

komentarz 18 marca 2024 przez MichaelM Bywalec (2,910 p.)
Znalazłem rozwiązanie, ale dziękuję. Twój sposób wydaje się być lepszy. Dziękuję też za wyjaśnienie jak działa Flow.

Podobne pytania

0 głosów
0 odpowiedzi 282 wizyt
0 głosów
0 odpowiedzi 149 wizyt

93,337 zapytań

142,332 odpowiedzi

322,423 komentarzy

62,676 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...