什么是TStream中的元组?

时间:2018-05-25 09:32:41

标签: java apache-edgent

以下是Apache Edgent Documentation

的代码

我无法理解究竟是什么元组。代码如下:

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 个答案:

答案 0 :(得分:3)

TStream<T> interface旨在模拟数据流,通常是传感器读数。在这种情况下,T是用于存储个人阅读的类型,但是阅读&#39;实际上可以意味着将多个数字(例如温度,湿度和风速)连接在一起成为单一的复合类型,这里通常将其称为“元组”。价值观。

但是,查看示例的上下文,我们正在处理简单温度读数流,因此T对应于单个数字类型Double。所以选择&#39; tuple&#39;作为变量名称有点令人困惑(数学上,它是 1-tuple ,但在这种情况下,这仅仅意味着&#39;数字&#39;)。

在您的代码中,filter()方法需要predicate,此处为

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

并且optimalTempRangeRef.get()会返回Range(Double),因此谓词会说&#34;我们的温度值是否超出最佳范围?&#34;

来自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 lambda语法时出现问题,因此您可以使用匿名内部类重写代码,如下所示:

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 );
}