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

标签 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> ...

对带有收集器分组的Stream API感到困惑,我无法使用按类型分组的Map[OldObject, NewObject]来完成。我可以保证两套啤酒都是满的,并且我能够找到成对的。我认为我可以从枚举流开始(但不知道这是否是一个好的方法):

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

最佳答案

如果你真的想要 Streams,最简单的方法就是选择类似的东西

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))

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

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

关于java - 如何通过其参数查找并收集要映射的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60227856/

相关文章:

c++ - 使用非捕获 lambda 作为可变参数模板函数的函数指针参数给出 "no matching function call"

java - 如果在 Java 中关闭套接字,是否需要关闭流?

java enum ArrayList - 这可能吗?

function - 没有名为 'psycopg2._psycopg' 的模块

c# - Func Invoke,有没有更好的解决办法

c - 在 Linux 中读取 USB 端口

ios - Swift - 如何在使用 AVFoundation 录制音频时消除延迟

java - javafx 主要方法 launch(args) 是如何工作的?

java - 如何在 Java 中从大图像中删除图像元数据而不导致内存不足

java - 什么时候应该或不应该使用更通用的变量类型来引用我的对象?