2

我有一个对象列表,每个对象都有一个布尔“选定”属性。如果“selected”属性为真,我希望将它们放在一组中。除了通过将每个对象添加到集合中的 for 循环之外,还有其他方法可以实现这一点吗?

4

4 回答 4

2

对于这么简单的事情,只需编写一个循环并完成它。

如果这是您将一遍又一遍地实现的模式:

(未经测试,因此可能有一两个错字)

public interface Selector<T> {
    public boolean select(T t); }

public <T> Set<T> grep(Collection<T> coll, Selector<T> sel) {
    Set<T> result = new Set<T>;
    for (T item : coll)
        if (sel.select(T)) 
            result.add(T);
    return result;
}

和调用

List<SomeClasss> input = ...;
Set<SomeClass>   output = grep(
    input, 
    new Selector<SomeClass> { 
        public boolean select(SomeClass item) {
            return some-boolean-function-of-item; // decide which items to keep here
        }
    }
);

Selector知道如何检查对象并决定是否应该保留它们的实现。

于 2012-07-04T08:20:43.850 回答
1

您可以为它使用任何功能性的 java 库。例如,根据我使用 Lambdaj ( http://code.google.com/p/lambdaj/ ) 的经验:

Set<Entity> entitiesSet = new HashSet<Entity>(filter(having(on(Entity.class).getSelected(), equalTo(true)), entities));
于 2012-07-04T08:23:54.883 回答
1

嗯,我想您正在寻找的是一种功能方法。我建议看一下lamdaj(如果您想坚持使用 Java 并且只需要 API)或Scala(如果您想要更丰富的功能集)。

一个例子

命令式版本:

List<Sale> salesOfAFerrari = new ArrayList<Sale>();
for (Sale sale : sales) {
    if (sale.getCar().getBrand().equals("Ferrari")) 
        salesOfAFerrari.add(sale);
}

您可以使用 lambdaj 在一行中完成:

List<Sale> salesOfAFerrari = select(sales,
    having(on(Sale.class).getCar().getBrand(),equalTo("Ferrari")));
于 2012-07-04T08:24:14.783 回答
1

如果您使用java 8,您可以这样做:

List<MyObject> myList = Arrays.asList(a,b,c,d);

Set<MyObject> mySet = myList
        .filter(e -> e.getMyBool())
        .into(new Set<MyObject>());

假设a-d只是具有布尔属性的对象的实例。但是 java 8 还没有出来,所以我只使用一个 for 循环。

于 2012-07-04T08:26:58.087 回答