Lambda 卡夫卡流:如何通过从值列表中选择键来为流重新设置键

Lambda 卡夫卡流:如何通过从值列表中选择键来为流重新设置键,lambda,apache-kafka-streams,Lambda,Apache Kafka Streams,我有一个目标A: public class A { String id; List<String> otherIds; SomeOtherObject object; } 公共A类{ 字符串id; 列出其他ID; 其他物体; } 我有一个卡夫卡流,看起来像: KStream<Integer, A> inputStream KStream输入流 我需要重新输入这个输入流流,以便它现在应该是: KStream<String, A> newStr

我有一个目标A:

public class A {
  String id;
  List<String> otherIds;
  SomeOtherObject object;
}
公共A类{
字符串id;
列出其他ID;
其他物体;
}
我有一个卡夫卡流,看起来像:

KStream<Integer, A> inputStream
KStream输入流
我需要重新输入这个输入流流,以便它现在应该是:

KStream<String, A> newStream
KStream新闻流
其中,新闻流的关键部分是otherIdfromA.otherId

例如 比方说,A类似于:{id:1,otherid:[“ab”、“bc”、“ca”],OtherObject:obj1}。 如果喜欢,输入流, 那么新闻流应该有: 大致来说,要了解我正在尝试的是:
KStream新闻流=
输入流
.map((键,val)->
val.getOtherIds().stream().forEach(e->
键值对(e,val))
);

有什么方法可以做到这一点(通过从值列表中选择键来重新键入)?

当您想将一条记录拆分为多条记录时,应该使用
flatMap()
而不是
map()
map()
是1:1操作,而
flatMap()
是1:n操作


要返回多个
KeyValue
对,您的
flatMap()
可以
返回
列表
(任何其他
集合
类型也可以)。

当您要将一条记录拆分为多条记录时,应该使用
flatMap()
而不是
map()
map()
是1:1操作,而
flatMap()
是1:n操作

要返回多个
KeyValue
对,您的
flatMap()
可以
返回
列表
(任何其他
集合
类型也可以)。

根据@Matthias的建议,我这样做了(有效):
KStream新闻流=
输入流
.flatMap((键,A)->{
返回一个.getOtherIdsList().stream().map(id->{
返回KeyValue.pair(id,A);
})
.collect(收集器.toSet());
});
谢谢你

根据@Matthias的建议,我这样做了(很有效):
KStream新闻流=
输入流
.flatMap((键,A)->{
返回一个.getOtherIdsList().stream().map(id->{
返回KeyValue.pair(id,A);
})
.collect(收集器.toSet());
});
多谢各位

Let's say, A is like : { id:1, otherIds:[ "ab","bc","ca"],OtherObject: obj1}.

And inputStream if like <1,A>,

Then the newStream should have:
<"ab",A>
<"bc", A>
<"ca",A>
 KStream<String,  A> newStream =
        inputStream
                .map((key,val) ->
                                val.getOtherIds().stream().forEach(e->
                        KeyValue.pair(e,val))
                );
KStream<String,  A> newStream =
        inputStream
                .flatMap((key,A)->{

                    return A.getOtherIdsList().stream().map( id ->{
                        return KeyValue.pair(id, A);

                            })
                            .collect(Collectors.toSet());
                 });