如何在 Java 中将值修改为 Tuple2
How to modify a value to Tuple2 in Java
我在折叠函数中使用累加器。我想更改累加器的值。
我的函数看起来像这样:
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
的这些属性是最终的?如何为它们赋值?
快速编辑:
我可以做的是 rust return 一个新的元组,但在我看来这不是一个好的解决方案 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;
我不知道你在和哪个 Tuple2
合作。 return 一个新对象怎么样:
Tuple2<String, Long> tuple = new Tuple2<String, Long>();
tuple._1 = event.getUser();
tuple._2 = event.getOtherThing() + acc._2;
return tuple;
我不知道您还在使用哪种 Tuple2,但我认为它是一个 scala Tuple2。
Scala Tuple2 是不可变的。您不能更改不可变对象的值,您必须重新创建它。
为什么? scala Tuple2 是一种函数式编程 "Data structure" 因此,作为函数式编程的所有概念”,它试图减少副作用。
您可以根据需要使用 .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);
}
我在折叠函数中使用累加器。我想更改累加器的值。
我的函数看起来像这样:
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
的这些属性是最终的?如何为它们赋值?
快速编辑:
我可以做的是 rust return 一个新的元组,但在我看来这不是一个好的解决方案 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;
我不知道你在和哪个 Tuple2
合作。 return 一个新对象怎么样:
Tuple2<String, Long> tuple = new Tuple2<String, Long>();
tuple._1 = event.getUser();
tuple._2 = event.getOtherThing() + acc._2;
return tuple;
我不知道您还在使用哪种 Tuple2,但我认为它是一个 scala Tuple2。 Scala Tuple2 是不可变的。您不能更改不可变对象的值,您必须重新创建它。 为什么? scala Tuple2 是一种函数式编程 "Data structure" 因此,作为函数式编程的所有概念”,它试图减少副作用。 您可以根据需要使用 .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);
}