如何用Java包装集合的每个对象?

如何用Java包装集合的每个对象?,java,collections,wrapper,Java,Collections,Wrapper,我有一个类Foo,为此我制作了一个等价包装类WrappedFoo,以更改程序某些部分中的equals()契约 我需要从Foo对象转换为WrappedFoo对象,在许多地方,反之亦然。但是我还需要将Foos和WrappedFoo的Collections从一个转换到另一个。我有没有办法用一种通用的方法来实现这一点 基本上我想要一个这样的方法: public static Collection<WrappedFoo> wrapCollection(Collection<Foo>

我有一个类
Foo
,为此我制作了一个等价包装类
WrappedFoo
,以更改程序某些部分中的
equals()
契约

我需要从
Foo
对象转换为
WrappedFoo
对象,在许多地方,反之亦然。但是我还需要将
Foo
s和
WrappedFoo
Collection
s从一个转换到另一个。我有没有办法用一种通用的方法来实现这一点

基本上我想要一个这样的方法:

public static Collection<WrappedFoo> wrapCollection(Collection<Foo> collection)
公共静态集合包装集合(集合集合)

问题是,我不知道将使用哪种类型的
集合
实现,我希望使用反射API为生成的
集合
保留相同的实现,您可以这样做(注意方法名称中的
0
):

也许Google Guava库提供了您想要的功能


您应该能够传递一个在WrappedFoo中封装Foo元素的函数。主要问题是新集合作为原始集合的视图是否可以接受(因此它将不会具有与原始集合相同的实现)。

集合接口保证存在“boolean addAll(collection c)”方法。 我只是想尝试一些类似的方法:

公共静态集合包装oos(集合列){
Class colClass=col.getClass();
集合newCol=colClass.getConstructor().getInstance();
新科尔.阿达尔(科尔);
返回newCol;
}

这个问题已经问了好几年了,但自从java 1.8以来,您可以使用streams来实现这一点:

public static Collection<WrappedFoo> wrapCollection(Collection<Foo> collection) {
    List<WrappedFoo> wrappedList = collection.stream().map(m -> new WrappedFoo(m)).collect(Collectors.toList());
        return new ApiBulkResponse<Wrapper>(wrappedList);
}
公共静态集合包装集合(集合集合){
List wrappedList=collection.stream().map(m->new WrappedFoo(m)).collect(Collectors.toList());
返回新的ApiBulkResponse(wrappedList);
}

您只需在
WrappedFoo
类中提供一个构造函数,即可将
Foo
对象转换或封装到
WrappedFoo

中。注意:
集合是一个
接口
,因此具有
实现
,而不是“子类”。@Alnitak更正;)Thankstransform()返回泛型
集合
而不是具体的集合类型。我对OP要求的理解是,传入
列表
获取
列表
@Kent我认为我的答案是合适的,因为该方法与他的方法签名匹配。我确实通过提到它返回一个视图集合来限定我的回答。我不能
addAll()
,因为
WrappedFoo
没有扩展
Foo
。但是,如果执行一个循环并添加每个循环,然后调用将
Foo
包装到
WrappedFoo
中的方法,应该可以工作。然后这与@Martijn Courtaux的答案相符。我只是想避免使用反射。你是对的,包装需要明确地完成。但是,我认为您无法绕过反射,从而在不使用原始collections类的情况下实例化集合,因为您希望保留原始的集合实现。这基本上是我提出的两个解决方案,但它们都不理想:我不喜欢编写一堆类似的方法,我更喜欢避免使用反射。我想看看是否有更整洁的解决办法。如果没有人找到更好的解决方案,我会接受这个答案。事实上,反思并没有那么糟糕。同时尝试这两种方法。等一下,我会编辑我的答案。是的,它确实没有那么糟糕,而且似乎是目前最好的解决方案。如果一个特定的集合实现没有无参数构造函数,它就会崩溃,但我想这是非常罕见的。我不认为这会像OP所希望的那样保留特定的传入集合。
public static ArrayList<WrapperFoo> wrapCollection(ArrayList<Foo> src)
{
    return (ArrayList<WrapperFoo>) wrapCollection0(src);
}

public static Vector<WrapperFoo> wrapCollection(Vector<Foo> src)
{
    return (Vector<WrapperFoo>) wrapCollection0(src);
}

...
public static Collection<WrappedFoo> wrapCollection(Collection<Foo> collection) {
    List<WrappedFoo> wrappedList = collection.stream().map(m -> new WrappedFoo(m)).collect(Collectors.toList());
        return new ApiBulkResponse<Wrapper>(wrappedList);
}