2014-10-07 3 views
1

Возможно, некоторые основные вещи, которые мне не хватает здесь, но каков наилучший способ выбора объектов, соответствующих некоторым критериям из списка? Скажем, у нас есть:Выбор конкретных объектов из списка с помощью Java

class MyObject { 
    int id; 
    String type; 

    // getters..setters 
} 

Я использую его:

List<MyObject> myObjects = new ArrayList<MyObject>(); 
    myObjects = getListOfObjects(); 

Теперь давайте говорить, что в myObjects есть 10 пунктов и 3 из них имеют type=="bla". На данный момент я просто перебираю все объекты и в цикле решает, хочу я это или нет, но есть ли лучший способ?

Я помню, что в C# я использовал, чтобы иметь что-то вроде

myObjects.Where(x => x.type.equals("bla")); 

PS, я таргетирования Java 7, нет лямбды для меня пока.

+0

Тогда вы уже делаете это правильно. –

+1

Если вы пытаетесь избежать циклического перехода по списку и намереваться всегда извлекать группы объектов по типу, рассмотрите «Карта <Строка», «Список » ' –

+0

. Другой альтернативой может быть многоугольник guava. В вашем случае «бла» будет ключевым. http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html –

ответ

0

Я не думаю, что вы можете сделать это, не создавая какой-либо индекс. Так, например, имея Map<String, Map<String, Set<MyObject>>>, вы можете позвонить по телефону index.get("type").get("bla"). Но вам придется сначала построить эту структуру. Это было бы полезно, если: a) никаких изменений в свойствах нет И b) у вас много объектов. Для 10 объектов производительность здесь не имеет значения, и я просто просто буду делать то, что вы делаете прямо сейчас, и спрятать ее внутри какого-нибудь красивого удобного метода.

0

Вы можете использовать LambdaJ library и его метод Lambda.exists с помощью специального пользовательского сочетания Hamcrest. Тогда вы могли бы сделать свой основной код выглядит следующим образом:

if (exists(myObjects, typeIs("bla"))) { /* ... */ } 

... при условии, что вы создаете этот метод пользовательских Сличитель typeIs самостоятельно. Но я бы не пошел так, если бы у меня было только одно место с 10 пунктами в списке.

Это также зависит от ваших данных: если ваш список отсортирован, вы можете do a binary search на нем. Это более полезно, если у вас есть тысячи элементов в списке.

Наконец, вы могли бы просто использовать Collection.contains: myObjects.contains(blaElement), но это требует, чтобы blaElement имеет такой equals метод, который возвращает «истину», если соответствующий типу.