2 votes

Qu'est-ce qu'un tuple exactement dans TStream ?

Voici le code extrait de la documentation d'Apache Edgent

Je n'ai pas pu comprendre ce qu'est exactement un tuple. Le code est donné ci-dessous :

public static void main(String[] args) throws Exception {
    TempSensor sensor = new TempSensor();
    DirectProvider dp = new DirectProvider();
    Topology topology = dp.newTopology();

    TStream tempReadings = topology.poll(sensor, 1, TimeUnit.MILLISECONDS);
    TStream simpleFiltered = tempReadings.filter(tuple ->
            !optimalTempRangeRef.get().contains(tuple));
    simpleFiltered.sink(tuple -> System.out.println("La température est hors de la plage acceptable! "
            + "Elle est de " + tuple + "\u00b0F!"));

    tempReadings.print();

    dp.submit(topology);
}

L'erreur que j'obtiens est tuple cannot be resolved to a variable. Quelle est exactement l'erreur que je suis en train de faire? Merci.

3voto

Richard Inglis Points 3167

L'interface TStream est conçue pour modéliser un flux de données, généralement des lectures de capteurs. Le T dans ce cas est le type utilisé pour stocker une lecture individuelle, mais 'lecture' peut vraiment signifier plusieurs nombres (par exemple température, humidité & vitesse du vent) joints ensemble dans un seul type composite, généralement appelé ici un 'tuple' de valeurs.

Cependant, en regardant le contexte de votre exemple, nous traitons un flux de simples lectures de température, donc ici T correspond à un seul nombre de type Double. Ainsi, le choix de 'tuple' comme nom de variable est un peu confus (mathématiquement, c'est un 1-tuple, mais dans ce cas cela signifie simplement 'un nombre').

Dans votre code, la méthode filter() prend un prédicat, qui est ici

tuple -> !optimalTempRangeRef.get().contains(tuple)

Et optimalTempRangeRef.get() renvoie un Range(Double), donc le prédicat signifie "notre valeur de température est-elle en dehors de notre plage optimale?"

À partir de la documentation pour Range:

contains() est utilisé pour vérifier l'appartenance : par exemple

 Ranges.closed(2,4).contains(2);    // retourne true
 Ranges.open(2,4).contains(2);      // retourne false
 Ranges.atLeast(2).contains(2);     // retourne true
 Ranges.greaterThan(2).contains(2); // retourne false
 Ranges.atMost(2).contains(2);      // retourne true
 Ranges.lessThan(2).contains(2);    // retourne false

ÉDIT :

On dirait que votre IDE a du mal avec la syntaxe lambda de Java 8, vous pouvez donc réécrire votre code en utilisant des classes internes anonymes, comme ceci:

import org.apache.edgent.function.Predicate;
import org.apache.edgent.function.Consumer;

public static void main( String[] args ) throws Exception
{
    TempSensor sensor = new TempSensor();
    DirectProvider dp = new DirectProvider();
    Topology topology = dp.newTopology();

    TStream tempReadings = topology.poll( sensor, 1, TimeUnit.MILLISECONDS );
    TStream filteredStream = tempReadings.filter( new Predicate()
    {
        public boolean test( Double reading )
        {
            return !optimalTempRangeRef.get().contains( reading );
        }
    } );

    filteredStream.sink( new Consumer()
    {
        public void accept( Double reading )
        {
            System.out.println( "La température est hors de la plage! "
                                + "C'est " + reading + "\u00b0F!" )
        }
    } );

    tempReadings.print();

    dp.submit( topology );
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X