Java 如何在Apache Beam中同时使用MapElements和KV?

Java 如何在Apache Beam中同时使用MapElements和KV?,java,java-8,apache-beam,Java,Java 8,Apache Beam,我想做一些事情,比如: PCollection<String> a = whatever; PCollection<KV<String, User>> b = a.apply( MapElements.into(TypeDescriptor.of(KV<String, User>.class)) .via(s -> KV.of(s, new User(s)))); PCollection a=无论什么; PC

我想做一些事情,比如:

PCollection<String> a = whatever;
PCollection<KV<String, User>> b = a.apply(
        MapElements.into(TypeDescriptor.of(KV<String, User>.class))
        .via(s -> KV.of(s, new User(s))));
PCollection a=无论什么;
PCollection b=a.apply(
MapElements.into(类型描述符(KV类))
.通过(s->KV.of(s,新用户);
其中User是一个自定义数据类型,具有Arvo编码器和考虑字符串的构造函数

但是,我得到以下错误:

无法从参数化类型中选择

我试图将其改为(KV.class)的
TypeDescriptor.of,但随后我得到:

不相容类型;必需的PCollection>但推断为输出“apply”:不存在类型变量的实例,因此PCollection符合PCollection>

那么,我应该如何将
KV
mapements
一起使用呢

我知道我想做的是使用
ParDo
可以实现,我可以通过清除
new DoFn
明确指定如何执行类型擦除,但是
ParDo
不支持lambda函数。当我们使用Java 8时,这似乎不那么优雅….

因为在编译过程中,
KV.class
被转换为
KV.class
,并且在运行时
KV.class
没有足够的信息来推断编码器,因为类型变量已被删除

要绕过这个限制,您需要使用一种机制,在编译后保留类型信息。例如,您可以使用:

TypeDescriptors.kvs(TypeDescriptors.strings(), TypeDescriptor.of(User.class))
这与提供您自己的匿名类相同:

new TypeDescriptor<KV<String, User>> {}
newtypedescriptor{}

提供绑定了类型变量的匿名类是当前Java中避免类型擦除的方法之一。

尝试使用SimpleFunction-它保留类型信息