【问题标题】:what exactly is tuple in TStream?TStream 中的元组到底是什么?
【发布时间】:2018-05-25 19:55:19
【问题描述】:

这是取自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);
}

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

【问题讨论】:

  • @ElliottFrisch 请尝试证明您对我的问题的回答。谢谢。
  • 请提出明确的问题。如果您收到错误,请始终包含完整的错误消息,包括堆栈跟踪。如您所见,人们对您所问的 qhat 感到困惑,而您得到的答案并没有多大帮助。通过更清楚来避免这种情况。阅读How to Ask,谢谢。
  • @ArunSubba 请尝试证明您明显没有阅读关于您提出问题的目的而如此友好地提供的链接。

标签: java apache-edgent


【解决方案1】:

TStream&lt;T&gt;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 进行编译? -&gt; 语法仅从 Java 8 开始
  • 感谢您的回答,但它仍然说:运算符 > 未定义参数类型 Double, boolean
  • 实际上我在带有 Raspbian 操作系统的 Raspberry Pi3 上使用 Eclipse IDE。我有 java 版本“1.8.0_65”。
  • 检查您的 Eclipse 项目是否设置为使用 Java 8 语法
  • 我的编译器合规级别是最高的 1.7
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2019-12-28
  • 1970-01-01
  • 2014-08-19
  • 2013-05-29
  • 2012-06-11
  • 1970-01-01
相关资源
最近更新 更多