Java 基于布尔属性将列表转换为集合的最简单方法?

Java 基于布尔属性将列表转换为集合的最简单方法?,java,list,loops,map,Java,List,Loops,Map,我有一个对象列表,每个对象都有一个布尔“selected”属性。如果“selected”属性为true,我希望将这些设置为一组。除了通过将每个对象添加到集合中的对象进行for循环之外,还有其他方法可以实现这一点吗?对于这样简单的事情,只需编写一个循环并完成它 如果这是一个您要反复实施的模式: (未经测试,因此可能有一两个打字错误) 公共接口选择器{ 公共布尔选择(T);} 公共集grep(集合集合集合、选择器sel){ 设置结果=新设置; 对于(T项:coll) 如果(选择(T)) 结果:添加(

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

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

如果这是一个您要反复实施的模式:

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

公共接口选择器{
公共布尔选择(T);}
公共集grep(集合集合集合、选择器sel){
设置结果=新设置;
对于(T项:coll)
如果(选择(T))
结果:添加(T);
返回结果;
}
以及调用

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
        }
    }
);
列表输入=。。。;
设置输出=grep(
输入,
新选择器{
公共布尔选择(SomeClass项){
返回item的一些布尔函数;//决定在此处保留哪些项
}
}
);

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

您可以使用任何功能性java库。 例如,根据我使用Lambdaj()的经验:

Set entitiesSet=new HashSet(过滤器(具有(on(Entity.class).getSelected(),equalTo(true)),entities));

嗯,我想你要找的是一种功能性方法。我建议您看看(如果您想坚持使用Java并且只需要API)或者(如果您想要更丰富的特性集)

示例

命令式版本:

List<Sale> salesOfAFerrari = new ArrayList<Sale>();
for (Sale sale : sales) {
    if (sale.getCar().getBrand().equals("Ferrari")) 
        salesOfAFerrari.add(sale);
}
List salesofarrari=new ArrayList();
销售(销售:销售){
如果(sale.getCar().getBrand().equals(“法拉利”))
法拉利的销售。添加(销售);
}
您可以使用lambdaj在一行中完成此操作:

List<Sale> salesOfAFerrari = select(sales,
    having(on(Sale.class).getCar().getBrand(),equalTo("Ferrari")));
List salesofarrari=选择(销售、,
拥有(在(销售类).getCar().getBrand(),equalTo(“法拉利”));
如果使用,则可以执行以下操作:

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

Set<MyObject> mySet = myList
        .filter(e -> e.getMyBool())
        .into(new Set<MyObject>());
List myList=Arrays.asList(a、b、c、d);
设置mySet=myList
.filter(e->e.getMyBool())
.插入(新集合());

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

你想从什么映射到什么?你可以得到一个库来为你做循环和属性访问(Google Guava可以做到),但这并不会让它有任何不同(或者对代码来说更简洁)。你想要一个集合还是一个映射?如果是map,那么这个键的值是多少?@JigarJoshi:我想他说的“map”是指“set”(他说了三次中的一次)。对不起,我是指“set”。这个问题太快了一点。请注意调用的类型不少于直接循环。。。Java8将在这里提供帮助。还请注意,每次需要使用此代码时,都会创建一个新的选择器实例。此外,每次需要这种迭代时都会生成一个新类。因此,我真的建议对循环使用一个简单的
。我必须接受这样一个事实,循环有时是最有效的方法。干杯,再见;集合文字:这是否真的为7或8做了删减?@Thilo我不认为为7做了删减,为示例添加了一个小说明(lambdaj示例是第二个示例)。
List<Sale> salesOfAFerrari = select(sales,
    having(on(Sale.class).getCar().getBrand(),equalTo("Ferrari")));
List<MyObject> myList = Arrays.asList(a,b,c,d);

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