Что такое кортеж в TStream?

Вот код, взятый из Документация 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);
}

Я получаю ошибку кортеж не может быть преобразован в переменную. В чем именно заключается ошибка, которую я получаю? Спасибо.

А вложенная упорядоченная пара.

Elliott Frisch 25.05.2018 11:35

@ElliottFrisch, пожалуйста, попробуйте обосновать свой ответ на мой вопрос. Спасибо.

Arun Subba 25.05.2018 11:50

Пожалуйста, задавайте четкие вопросы. Если вы получаете сообщение об ошибке, всегда включайте полное сообщение об ошибке, включая stacktrace. Как видите, люди не понимают, qhat именно вы спрашиваете, и вы получаете ответы, которые не очень помогают. Избегайте этого, говоря более четко. Прочтите Как спросить, спасибо.

Zabuzard 25.05.2018 12:29

@ArunSubba Пожалуйста, попытайтесь оправдать свой очевидный отказ прочитать ссылку, любезно предоставленную в отношении цели, с которой вы задаете свой вопрос.

user207421 25.05.2018 12:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TStream<T>интерфейс предназначен для моделирования потока данных, обычно показаний датчиков. T в данном случае является типом, используемым для хранения отдельного показания, но «чтение» на самом деле может означать несколько чисел (например, температура, влажность и скорость ветра), объединенных в один составной тип, который в общем упоминается здесь как «кортеж». 'ценностей.

Однако, глядя на контекст вашего примера, мы имеем дело с потоком простых показаний температуры, поэтому здесь 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 );
}

А для какой версии Java вы компилируете? Синтаксис -> только начиная с Java 8

Richard Inglis 25.05.2018 12:30

Спасибо за ваш ответ, но он по-прежнему говорит: Оператор> не определен для типа (ов) аргумента Double, boolean

Arun Subba 25.05.2018 12:32

На самом деле я использую eclipse IDE на Raspberry Pi3 с ОС Raspbian. У меня версия java "1.8.0_65".

Arun Subba 25.05.2018 12:34

Убедитесь, что ваш проект Eclipse настроен на использование синтаксиса Java 8.

Richard Inglis 25.05.2018 12:35

У меня уровень соответствия компилятора 1,7, что является наивысшим

Arun Subba 25.05.2018 12:40

Спасибо, Ричард Инглис, за помощь, она мне очень помогла.

Arun Subba 26.05.2018 08:25

Ричард Инглис, не могли бы вы помочь мне с метод фильтрации

Arun Subba 27.05.2018 08:22

Другие вопросы по теме