Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Java中的值的Zip 2集合_Java_Collections_Java Stream_Iterable - Fatal编程技术网

基于Java中的值的Zip 2集合

基于Java中的值的Zip 2集合,java,collections,java-stream,iterable,Java,Collections,Java Stream,Iterable,我有两个Collections对象A和B,它们有一个字段键。我希望基于该字段压缩这两个集合,以使对象A和B的元组具有相同的键 发件人: Collection<A> a; Collection<B> b; 集合a; b组; 致: List ab;//其中A和B具有相同的键字段 我现在正在做的是手动构建一个地图,并从中创建一个列表,但我相信有更好的方法可以做到这一点 编辑(解释我是如何创建地图的): Map keytoandb=newhashmap(); a、 流()

我有两个
Collection
s对象
A
B
,它们有一个字段
。我希望基于该字段压缩这两个集合,以使对象A和B的元组具有相同的

发件人:

Collection<A> a;
Collection<B> b;
集合a;
b组;
致:

List ab;//其中A和B具有相同的键字段
我现在正在做的是手动构建一个
地图
,并从中创建一个列表,但我相信有更好的方法可以做到这一点

编辑(解释我是如何创建地图的):

Map keytoandb=newhashmap();
a、 流()
.forEach(aa->keyto和B.put(
aa.getKey(),
一对(aa,null));
b、 流()
.forEach(bb->keyto和B.put(
bb.getKey(),
一对(
keyto和b.get(bb.getKey()).getFirst(),
bb),;

与您的解决方案没有太大区别,但比您的解决方案稍微干净一些:

Map<KeyType, A> keyToA = a.stream()
    .collect(Collectors.toMap(A::getKey, Function.identity()));

List<Pair<A, B>> ab = b.stream()
    .map(bb -> Pair.of(keyToA.get(bb.getKey()), bb))
    .collect(Collectors.toList());
Map keyToA=a.stream()
.collect(Collectors.toMap(A::getKey,Function.identity());
列表ab=b.流()
.map(bb->Pair.of(keyToA.get(bb.getKey()),bb))
.collect(Collectors.toList());
如果您愿意承受二次性能,可以使用嵌套流:

List<Pair<A, B>> ab = a.stream()
    .map(aa -> Pair.of(aa, b.stream()
        .filter(bb -> bb.getKey().equals(aa.getKey()))
        .findAny()
        .get()))   // will throw exception if missing
    .collect(Collectors.toList());
List ab=a.stream()
.map(aa->Pair.of(aa,b.stream)()
.filter(bb->bb.getKey().equals(aa.getKey()))
.findAny()
.get())//如果丢失,将引发异常
.collect(Collectors.toList());

为了让问题更清楚,请说明您是如何创建
地图的
是的,稍微清晰一点。我想知道是否有一种方法不使用中间映射,但我不这么认为
Map<KeyType, A> keyToA = a.stream()
    .collect(Collectors.toMap(A::getKey, Function.identity()));

List<Pair<A, B>> ab = b.stream()
    .map(bb -> Pair.of(keyToA.get(bb.getKey()), bb))
    .collect(Collectors.toList());
List<Pair<A, B>> ab = a.stream()
    .map(aa -> Pair.of(aa, b.stream()
        .filter(bb -> bb.getKey().equals(aa.getKey()))
        .findAny()
        .get()))   // will throw exception if missing
    .collect(Collectors.toList());