繁体   English   中英

从集合中分派 <TypeA> 设置 <TypeB>

[英]PArsing from Set<TypeA> to Set<TypeB>

我有一个奇怪的问题,希望有人能帮助我。 我正在使用Java。

我从方法中收到一个Set。 该TypeA正是我想要的,但是我想为其添加更多功能,以提高代码的清洁度。

在C#中,我可以编写扩展方法,但是我不认为Java具有这样的功能,因此我想创建一个新类型TypeB,其中包含TypeA变量并执行我想要的额外功能(例如包装器) /适配器)。 但问题是:

我做不到

Set<TypeB> mySet = myMethod();

要么

Set<TypeB> mySet = (Set<TypeB>)myMethod();

完美的就是这样

Set<TypeB> mySet = new Set<TypeB>(myMethod());

但是Set是Java类型的,因此我无法向其添加构造函数。

我该怎么做才能清晰地解析它? 如果我添加类似的方法

Set<TypeB> mySet = parse(myMethod());

我将不得不遍历myMethod中的所有项目,这并不是很有效。

有没有比创建此方法更好的解决方案?

谢谢,奥斯卡

如果不是通过继承TypeA而是通过使用函数(静态方法)来添加功能,该怎么办:

所以代替:

public class TypeB {
    TypeA self;
    public void Frobnicate(int foo) {...}
}

写:

public class TypeAUtils {
    public static void Frobnicate(TypeA self, int foo) {...}
}

无论如何,C#扩展方法只是此技术的语法糖。

这是我最喜欢的设计模式之一。 我称它为“功能”,并且被低估了。 :-P

如果您无法通过这种方式进行操作(因此也无法使用扩展方法),则必须向TypeA添加状态,在这种情况下,您必须为集合中的每个对象分配更多的内存,这意味着您无法避免迭代。

只有这样

Set<TypeB> parse(Set<TypeA> old){
   Set<TypeB> res = new HashSet<TypeB>();
   for(TypeA a : old) res.add(new TypeB(a));
   return res;
}

或创建自己的集合。

编辑

(根据以下OP的澄清意见进行了修订。)

让我们假设B有一个构造函数

    public B(A a) { ... }

这会创建一个适应A实例的B 然后,从Set<A>创建Set<B>的最简单方法是:

    Set<A> aset = ...
    Set<B> bset = new HashSet<B>(aset.size());
    for (A a : aset) {
        bset.add(new B(a));
    }

Apache Commons Collections和Guava Collections包含可以将一个类的集合转换为另一个类的集合的基础结构,但是对于这样简单的事情,它们可能会显得过大。 (但是,如果您确实想走这条路,那么Guava会更好,因为API是可识别泛型的。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM