如何通过其参数查找和收集要映射的对象?

时间:2020-02-14 14:04:15

标签: java lambda stream java-stream

给出枚举:

enum Type {
  PRIMARY,
  SECONDARY
}

和具有相同参数(类型)的两个不同的对象集:

class OldObject {
  Long id;
  Type type;
}

class NewObject {
  Long id;
  String title;
  Type type;
}

...如下所示:

Set<OldObject> ...
Set<NewObject> ...

Beeing对带有 Collectors Groupings 的Stream API感到困惑我无法完成对 Map [OldObject,NewObject] 的分组通过类型。我能够保证两套啤酒都已满,并且能够找到对。我以为我可以从枚举流开始(但不知道这是一个很好的方法):

Map<OldObject, NewObject> pairs = Optional.of(Schema.values())...

2 个答案:

答案 0 :(得分:0)

如果您真的要使用Streams,最简单的方法就是使用类似的东西

"{Date:yyyy-MM-dd}-log.txt"

请注意,如果其中一个集合中不包含某些枚举,则此方法可能会出错,因为地图收集器不支持空值。 您可以通过在发生这种情况之前添加过滤器调用来防止这种情况的发生:

Map<Type, OldObject> oldObjectMap = oldObjectSet.stream().collect(Collectors.toMap(OldObject::getType, Function.identity()))
Map<Type, NewObject> newObjectMap = newObjectSet.stream().collect(Collectors.toMap(NewObject::getType, Function.identity()))

Map<OldObject, NewObject> pairs = Arrays
    .stream(Type.values())
    .collect(Collectors.toMap(oldObjectMap::get, newObjectMap::get))

答案 1 :(得分:0)

此刻我的代码如下:

        Map<OldObject, NewObject> compared = new HashMap<>();

        Arrays.stream(Type.values()).collect(Collectors.toSet()).forEach(s ->
                compared.put(
                        oldObjectsSet.stream()
                                .filter(o -> o.getType().equals(s))
                                .findFirst()
                                .orElseThrow(),
                        newObjectsSet.stream()
                                .filter(m -> m.getType().equals(s))
                                .findFirst()
                                .orElseThrow()
                ));

...可以用,但看起来不太好。