Java 从集合解析<;A型>;设置<;类型B>;
我有一个奇怪的问题,我希望有人能帮助我。 我正在使用Java 我从一个方法收到一个集合。这个TypeA正是我想要的,但是我想为它添加更多的功能,以提高代码的清洁度 在C#中,我可以编写扩展方法,但我认为Java没有类似的功能,因此我想创建一个新类型TypeB,它包含一个TypeA变量并执行我想要的额外功能(类似于包装器/适配器)。但问题是: 我做不到Java 从集合解析<;A型>;设置<;类型B>;,java,generics,Java,Generics,我有一个奇怪的问题,我希望有人能帮助我。 我正在使用Java 我从一个方法收到一个集合。这个TypeA正是我想要的,但是我想为它添加更多的功能,以提高代码的清洁度 在C#中,我可以编写扩展方法,但我认为Java没有类似的功能,因此我想创建一个新类型TypeB,它包含一个TypeA变量并执行我想要的额外功能(类似于包装器/适配器)。但问题是: 我做不到 Set<TypeB> mySet = myMethod(); Set mySet=myMethod(); 或 Set mySet=
Set<TypeB> mySet = myMethod();
Set mySet=myMethod();
或
Set mySet=(Set)myMethod();
什么才是完美的呢
Set<TypeB> mySet = new Set<TypeB>(myMethod());
Set mySet=newset(myMethod());
但是Set是一种Java类型,所以我不能向它添加构造函数
我如何才能以干净的方式解析它?
如果我添加一个方法,如
Set<TypeB> mySet = parse(myMethod());
Set mySet=parse(myMethod());
我必须遍历myMethod中的所有项,这不会非常有性能
有没有比创建此方法更好的解决方案
谢谢,
奥斯卡只有这样的smt
Set<TypeB> parse(Set<TypeA> old){
Set<TypeB> res = new HashSet<TypeB>();
for(TypeA a : old) res.add(new TypeB(a));
return res;
}
Set解析(Set old){
Set res=新的HashSet();
对于(类型a:旧)资源,添加(新类型B(a));
返回res;
}
或者创建自己的集。只有这样的smt
Set<TypeB> parse(Set<TypeA> old){
Set<TypeB> res = new HashSet<TypeB>();
for(TypeA a : old) res.add(new TypeB(a));
return res;
}
Set解析(Set old){
Set res=新的HashSet();
对于(类型a:旧)资源,添加(新类型B(a));
返回res;
}
或者创建您自己的集合。如果您不是通过继承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添加状态,在这种情况下,您必须为集合中的每个对象分配更多内存,这意味着您无法避免迭代。如果您不是通过继承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,在这种情况下,您必须为集合中的每个对象分配更多内存,这意味着您无法避免迭代。编辑
(根据OP下面的澄清意见进行了修订。)
让我们假设B
有一个构造函数
public B(A a) { ... }
这将创建一个B
适配a
实例。然后从集合创建集合的最简单方法是:
Set<A> aset = ...
Set<B> bset = new HashSet<B>(aset.size());
for (A a : aset) {
bset.add(new B(a));
}
Set aset=。。。
Set bset=newhashset(aset.size());
对于(A:aset){
B增加(新B(a));
}
Apache Commons集合和Guava集合包括可以将一个类的集合转换为另一个类的集合的基础设施,但是对于这样简单的东西来说,它们是多余的。(但是如果你真的想走这条路,Guava会更好,因为API可以识别泛型。)EDIT
(根据OP下面的澄清意见进行了修订。)
让我们假设B
有一个构造函数
public B(A a) { ... }
这将创建一个B
适配a
实例。然后从集合创建集合的最简单方法是:
Set<A> aset = ...
Set<B> bset = new HashSet<B>(aset.size());
for (A a : aset) {
bset.add(new B(a));
}
Set aset=。。。
Set bset=newhashset(aset.size());
对于(A:aset){
B增加(新B(a));
}
ApacheCommons集合和Guava集合包括可以将一个类的集合转换为另一个类的集合的基础设施,但是对于这样简单的东西来说,它们太过简单了(但是如果你真的想走这条路,Guava会更好,因为API可以识别泛型)是的,这正是我的解析方法,但出于性能原因,我不想遍历所有项目。但我认为这是不可能的:(@Oscar:在这种情况下,试试implementset。与创建新对象的成本相比,迭代的性能微不足道。即使这样,也可能很小。顺便说一句:大多数允许您避免使用循环的实用程序都会为您使用循环。也就是说,这是一种错觉。是的,这正是我拥有的解析方法,但我不想迭代所有的方法出于性能方面的原因,这些项目是不可能的。但我认为这是不可能的:(@Oscar:在这种情况下,试试implementset。与创建新对象的成本相比,迭代的性能微不足道。即使这样也可能很小。顺便说一句:大多数允许您避免使用循环的实用程序都会为您使用循环。也就是说,这是一种错觉。您的意思是“转换”而不是“解析”?不完全是“转换”意味着这些对象在某种程度上是相关的(例如,层次结构),而不是。你是说“转换”而不是“解析”吗?不完全是说,“转换”意味着这些对象在某种程度上是相关的(例如,层次结构)事实上,我认为他想要的是将集合转换为集合,其中B是a的子类型。嗨,对不起,如果这很难理解,我下次会努力改进:)。我有一个类型a,它是第三方类型,一个类型B,我制作并包含一个类型a变量,但它不是子类型,它是一个适配器。我想从一个集合创建这个集合,但我不知道如何创建。嗨,是的,这也是一种可能性,也是我以前的解决方案。之后,我使用了luqui的解决方案。tks!:)事实上,我认为他想要的是把集合转换成集合,其中B是a的一个子类型。嗨,对不起,如果这很难理解,我会