【问题标题】:Why isn't the filter method working?为什么过滤方法不起作用?
【发布时间】:2018-05-27 18:12:58
【问题描述】:

正如docs of Apache Edgent 中给出的那样,我试图过滤掉我的传感器读数,其中温度传感器的值必须在 80 到 85 F 之间。

但是当我尝试连接传感器时,读数为 75F,并且没有显示如下消息:温度超出范围

是不是过滤方法不起作用?如果是这样,请尝试帮助我。谢谢。

范围值设置为:

static double OPTIMAL_TEMP_LOW = 80.0;
static double OPTIMAL_TEMP_HIGH = 85.0;
static Range<Double> optimalTempRange = Ranges.closed(OPTIMAL_TEMP_LOW, OPTIMAL_TEMP_HIGH);

传感器对象是TempSensor ts

TempSensor ts = new TempSensor();
Stream<Double> temp = top.poll(ts, 1, TimeUnit.MILLISECONDS);

过滤部分:

TStream<Double> simpleFiltered = temp.filter(tuple ->
tuple < OPTIMAL_TEMP_LOW || tuple > OPTIMAL_TEMP_HIGH);
simpleFiltered.sink(tuple -> System.out.println("Temperature is out of range! "
+ "It is " + tuple + "\u00b0F!"));

/*TStream<Double> simpleFiltered = temp.filter(tuple ->
        !optimalTempRange.contains(tuple));
simpleFiltered.sink(tuple -> System.out.println("Temperature is out of range! "
            + "It is " + tuple + "\u00b0F!"));*/

// See what the temperatures look like
simpleFiltered.print();

dp.submit(top);

输出:

Selet a port:
1: ttyACM0 Port opened succesefully.
7373.40
73.40
73.40 ...

【问题讨论】:

  • 当您使用“optimalTempRange”时发生了什么? (已被注释掉)
  • @mangusta 输出保持不变。
  • 请检查下面的答案并给出反馈

标签: java apache apache-edgent


【解决方案1】:

我认为这是因为您的过滤器和接收器已分配给另一个 TStream 对象,而不是您要打印的那个。
可能你需要试试这个:

TempSensor ts = new TempSensor();
TStream<Double> temp = top.poll(ts, 1, TimeUnit.MILLISECONDS).filter(tuple ->
tuple < OPTIMAL_TEMP_LOW || tuple > OPTIMAL_TEMP_HIGH);
temp.sink(tuple -> System.out.println("Temperature is out of range! "
+ "It is " + tuple + "\u00b0F!"));

// See what the temperatures look like
temp.print();

dp.submit(top);

【讨论】:

  • @Arun Subba 在任何情况下您都可能同意应该打印过滤后的流而不是“temp”:)
  • 如何将过滤器分配回“temp”而不是“simpleFiltered”?
  • temp = temp.filter(tuple -> tuple OPTIMAL_TEMP_HIGH);
  • temp.sink(tuple -> System.out.println("温度超出范围!" + "它是" + tuple + "\u00b0F!"));
  • 它说重复的局部变量 temp。
【解决方案2】:

嗯,您的代码与文档中的示例相匹配,但看起来我们正在创建一个过滤流,然后在 temp.print() 中忽略它。

您可以尝试将该行更改为simpleFiltered.print()

【讨论】:

  • 对不起,我没有别的了
  • 会不会有硬件(传感器读数延迟)和代码(java代码)没有正确同步的可能?
  • @Arun Subba 你的 Java 程序迟早会得到一个值流,并相应地处理它们。这与同步无关
  • @Arun Subba 最奇怪的是,即使您为流过滤器尝试了完全相反的谓词,您仍然得到相同的输出(根据您的话)。我打赌你错过了那里的东西
  • @mangusta 感谢您的时间和精力。我发现错误不在我们试图弄清楚的代码中,而是在TempSensor 类的get() 方法上,该方法有一个while 循环,该循环不断打印接收到的数据哈哈。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多