Как изменить значение для Tuple2 в Java - PullRequest
0 голосов
/ 19 января 2019

Я использую аккумулятор в функции сгиба.Я хотел бы изменить значение аккумулятора.

Моя функция выглядит примерно так:

public Tuple2<String, Long> fold(Tuple2<String, Long> acc, eventClass event) 
{
    acc._1 = event.getUser();
    acc._2 += event.getOtherThing();
    return acc
}

Для меня это должно работать, потому что все, что я делаю, это изменяю значения аккумулятора.Однако, что я получаю, это Cannot assign value to final variable _1.То же самое для _2.Почему эти свойства acc окончательны?Как я могу присвоить им значения?

быстрое редактирование: Вт, что я могу, чтобы ржавчина вернула новый кортеж вместо этого, но, на мой взгляд, это не очень хорошее решение return new Tuple2<String, Long>(event.getUser(), acc._2 + event.getOtherThing());

решение для основы flink: Используйте Tuple2, определенный в flink.Импортируйте его, используя

import org.apache.flink.api.java.tuple.Tuple2;

, а затем используйте его с

acc.f0 = event.getUser();
acc.f1 += event.getByteDiff();
return acc;

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Я не знаю, какой тип Tuple2 вы по-прежнему используете, но я предполагаю, что это scala Tuple2. Scala Tuple2 это неизменный. Вы не можете изменить значение неизменяемого объекта, вы должны воссоздать его. Зачем? Scala Tuple2 - это функциональное программирование «Структура данных», так что, как и вся концепция функционального программирования, «оно пытается уменьшить побочный эффект». Вы можете использовать функцию .copy, чтобы воссоздать ее, как вы хотите. Ниже приведен пример кода:

 @Test
    public void test() {
        Tuple2<String,Long> tuple = new Tuple2<>("a",1l);
        Tuple2<String,Long> actual = tuple.copy(tuple._1,tuple._2+1);
        Tuple2<String,Long> expected = new Tuple2<>("a",2l);
        assertEquals(actual,expected);
    }

0 голосов
/ 19 января 2019

Я не знаю, с каким Tuple2 вы работаете.Как насчет возврата нового объекта:

Tuple2<String, Long> tuple = new Tuple2<String, Long>();
tuple._1 = event.getUser();
tuple._2 = event.getOtherThing() + acc._2;
return tuple;
...