scala—如何在java中将值修改为tuple2

2skhul33  于 2021-06-21  发布在  Flink
关注(0)|答案(2)|浏览(770)

我在折叠函数中使用累加器。我想更改累加器的值。
我的函数如下所示:

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框架的解决方案:使用flink中定义的tuple2。使用导入

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

然后把它和

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

sshcrbum1#

我不知道你还在用什么样的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);
    }
d4so4syb

d4so4syb2#

我不知道是哪个 Tuple2 你在和谁一起工作。返回一个新对象怎么样:

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

相关问题