bugfix> java > 投稿

ここから取得したコードは次のとおりですApache Edgentドキュメント

タプルが正確に何であるか理解できませんでした。コードは次のとおりです。

public static void main(String[] args) throws Exception {
    TempSensor sensor = new TempSensor();
    DirectProvider dp = new DirectProvider();
    Topology topology = dp.newTopology();
    TStream<Double> tempReadings = topology.poll(sensor, 1, TimeUnit.MILLISECONDS);
    TStream<Double> simpleFiltered = tempReadings.filter(tuple ->
            !optimalTempRangeRef.get().contains(tuple));
    simpleFiltered.sink(tuple -> System.out.println("Temperature is out of range! "
            + "It is " + tuple + "\u00b0F!"));
    tempReadings.print();
    dp.submit(topology);
}

私が得るエラーはタプルを変数に解決できません。私が得ているエラーは何ですか?ありがとうございました。

回答 1 件
  • ザ・ TStream<T>  インターフェイスは、データのストリーム、通常はセンサーの読み取り値をモデル化するように設計されています。ザ・ T  この場合、個々の測定値を保存するために使用されるタイプですが、「測定値」は実際には複数の数値(温度、湿度、風速など)を1つの複合タイプに結合することを意味します。値。

    ただし、例のコンテキストを見ると、単純な温度測定値のストリームを扱っているため、ここでは T  タイプ Double の単一の番号に対応 。したがって、変数名として「タプル」を選択することは少しわかりにくいです(数学的には、1タプル、しかしこの場合、それは単に「数」を意味します)。

    あなたのコードでは、 filter()  メソッドは、ここにある述語を取ります

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

    そして、 optimalTempRangeRef.get()   Range(Double) を返します 、したがって、述語は言っています「温度値は最適範囲外ですか?」

    Range のドキュメントから :

    contains() is used to check for containment: e.g.
     Ranges.closed(2,4).contains(2);    // returns true
     Ranges.open(2,4).contains(2);      // returns false
     Ranges.atLeast(2).contains(2);     // returns true
     Ranges.greaterThan(2).contains(2); // returns false
     Ranges.atMost(2).contains(2);      // returns true
     Ranges.lessThan(2).contains(2);    // returns false
    
    

    編集:

    IDEがJava 8ラムダ構文で問題を抱えているように見えるため、次のように匿名内部クラスを使用してコードを書き直すことができます。

    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<Double> tempReadings = topology.poll( sensor, 1, TimeUnit.MILLISECONDS );
        TStream<Double> filteredStream = tempReadings.filter( new Predicate<Double>()
        {
            public boolean test( Double reading )
            {
                return !optimalTempRangeRef.get().contains( reading );
            }
        } );
        filteredStream.sink( new Consumer<Double>()
        {
            public void accept( Double reading )
            {
                System.out.println( "Temperature is out of range! "
                                    + "It is " + reading + "\u00b0F!" )
            }
        } );
        tempReadings.print();
        dp.submit( topology );
    }
    
    

あなたの答え