[英]Convert List<TypeA> to Map<TypeA, List<TypeB>> using Java 8
[英]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.