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