2

オブジェクトのリストがあり、それぞれがブール値の「選択された」プロパティを持っています。「選択された」プロパティがtrueの場合、これらをセットに入れたいです。セットにそれぞれを追加するオブジェクトの for ループ以外に、これを達成する別の方法はありますか?

4

4 に答える 4

2

この単純なものについては、ループを記述してそれで実行するだけです。

これがパターンである場合は、何度も実装します。

(テストされていないため、タイプミスが1つか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を使用して1行で実行できます。

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 に答える