2014-09-04 3 views
0

У меня есть List<MyObject> list.Поиск объекта в списке со многими атрибутами объекта

MyObject выглядит следующим образом:

public class MyObject { 

    String typeOfObject; 

    Integer anInteger; 

    Integer value; 
} 

Как получить объект (ы) из list где typeOfObject = "objectA" и anInteger = 1?

Моя цель - установить множество переменных с value из MyObject.

Я посмотрел Predicate, но, похоже, я могу основывать свое условие поиска только на один атрибут?

+1

Если 'Predicate' работает для одного атрибута, как насчет цепочки Предикатов? Кроме того, что именно вы пробовали, 'stream(). Filter (...)'? –

+0

как насчет прохождения списка и получения того, что вам нужно? – iberbeu

+0

@tobias_k Есть ли у вас пример? – BnJ

ответ

1

Предикаты могут делать именно то, что вы хотите, и можете работать с таким количеством атрибутов, сколько вы хотите. Вам просто нужно реализовать метод evaluation() с любыми критериями, которые вы хотите протестировать.

public class MyPredicate implements Predicate { 
    private String testId; 
    private String otherId; 

    public MyPredicate(String testId,String otherId) { 
     this.testId = testId; 
     this.otherId = otherId; 
    } 

    public boolean evaluate(Object obj) { 
     boolean match = false; 
     if(obj instanceof MyObject) { 
      if(testId.equalsIgnoreCase(((MyObject)obj).getId()) 
      && otherId.equalsIgnoreCase(((MyObject)obj).getOtherId())) { 
       match = true; 
      } 
     } 
     return match; 
    } 
} 

Так что в вашем конкретном случае, оценить метод будет выглядеть примерно так:

public boolean evaluate(Object obj) { 
     boolean match = false; 
     if(obj instanceof MyObject) { 
      if("objectA".equals(((MyObject)obj).typeOfObject) 
      && 1 == ((MyObject)obj).anInteger) { 
       match = true; 
      } 
     } 
     return match; 
    } 
1

Вам необходимо переопределить equals() и hashcode(), чтобы связаться с нами this ссылка для достижения этой цели.

+0

Это должен быть правильный и чистый способ сделать это, если вы хотите избежать итерации над списком каждый раз, когда хотите получить элемент. – MichaelS

+0

@MichaelS true. –

1

Если вы используете Java 8, вы можете использовать filter, чтобы получить элементы, соответствующие Вашим критериям, например, используя лямбда-выражение. Вы также можете реализовать пользовательские Predicate и использовать его в filter

List<MyObject> objects = Arrays.asList(
     new MyObject("foo", 1, 42), 
     new MyObject("foo", 3, 23), 
     new MyObject("bar", 3, 42), 
     new MyObject("foo", 4, 42)); 
List<MyObject> filtered = objects.stream() 
     .filter(o -> o.typeOfObject.equals("foo") && o.value == 42) 
     .collect(Collectors.toList()); 
System.out.println(filtered); 

выхода является [(foo,1,42), (foo,4,42)], используя тестовый класс:

class MyObject { 
    String typeOfObject; 
    Integer anInteger; 
    Integer value; 
    public MyObject(String type, int i, int v) { 
     this.typeOfObject = type; 
     this.anInteger = i; 
     this.value = v; 
    } 
    public String toString() { 
     return String.format("(%s,%d,%d)", typeOfObject, anInteger, value); 
    }; 
}