java - TStream 中的元组到底是什么?

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

我收到的错误是元组无法解析为变量。我收到的错误到底是什么?谢谢。

最佳答案

TStream<T> interface旨在对数据流(通常是传感器读数)进行建模。 T在这种情况下,是用于存储单个读数的类型,但“读数”实际上可以表示多个数字(例如温度、湿度和风速)连接在一起形成单个复合类型,这里通常将其称为“元组”值。

但是,看看您的示例的上下文,我们正在处理一系列简单的温度读数,因此这里 T对应于类型 Double 的单个数字。因此,选择“元组”作为变量名有点令人困惑(从数学上讲,它是一个 1 元组,但在本例中仅意味着“数字”)。

在您的代码中,filter()方法需要 predicate ,这里是

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

关于java - TStream 中的元组到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50525962/

相关文章:

java - 使用其他基本运算符是否可以具有与 CoFlatMapFunction 相同的行为?

java - 如何从Servlet中的隐藏字段中获取数组值?

java - 如何正确地将 jars 组织到 Eclipse 中的一个文件夹中?

java - Java PriorityQueue(堆)插入n个元素的时间复杂度?

java - List<Object> 删除重复项,覆盖 equals

java - siddhi - 无法使用 siddhi 从rabbitmq 检索事件消息