2010-05-17 13 views
5

że mamCzy mogę wysłać zapytanie do listy? Java

List<SomeObject> objList = new ArrayList<SomeObject>(); 

Jeśli someObject zawiera pole o nazwie id. Możemy znaleźć to przez jakieś zapytania jak

objList.filter('id=2');

wihout zapętlenie poprzez liście? Jeśli nie, to dlaczego? Może to być tak użyteczna metoda i używana jako alternatywa do pisania żmudnych pętli?

Tylko pytanie, które przyszło mi do głowy, więc pomyślałem, że muszę go wyczyścić tutaj :)

góry dziękuję :)

+0

Zobacz http://stackoverflow.com/questions/122105/java-what-is-the-best-way-to-filter-a-collection – YuppieNetworking

+0

Dzięki Yuppie. Twoja jest najważniejszą odpowiedzią. – TCM

+1

Możesz zrobić objList.select (idEqualTo (2)) podczas korzystania z tej biblioteki https://github.com/nicholas22/jpropel-light. Musisz zdefiniować funkcję idEqualTo(), ale jest to jedna liniówka. –

Odpowiedz

1

Jeśli chcesz coś podobnego LINQ dla Java, sprawdź quaere


Edycja: W tym momencie quaere wygląda to źle utrzymanym. Ponieważ Java 7 jest EOL, powinieneś być na Java 8, której Stream API powinien dostać tam większość drogi w porównaniu do składni Linq's dot. Zobacz this page dla niektórych przykładów.

+1

stylowy, ewentualnie wolny, zawiera niejawną pętlę – p4553d

2

Nawet jeśli to był wspierany cechą języka, to byłoby Java, która będzie musiała wykonać iterację, więc powróciłeś do pierwszego (pod względem złożoności czasu).

Szukane jest mapowanie asocjacyjne. Można to osiągnąć za pomocą HashMap. Jeśli chcesz powiązać więcej niż jeden typ właściwości, na przykład id I name, możesz utworzyć dwie HashMaps, jedną, której klucz jest identyfikatorem, a drugą, której kluczem jest nazwa.

To oczywiście nie skaluje się zbyt dobrze, jeśli chcesz zapytać o wiele właściwości, więc następnym krokiem będzie użycie bazy danych zorientowanej obiektowo, takiej jak Hibernate, która pozwoli ci wysłać zapytanie do bazy danych o obiektach dokładnie tak, jak w twoim przykład.

+0

Cóż, ja nie martwię się o czas pracy. Bardziej martwię się o mój czas kodowania (moją wydajność). Tylko jedno dodatkowe wywołanie metody nie spowoduje marnego spowolnienia mojej aplikacji. I nie chcę używać struktury danych Hashtable. Właściwie chcę coś podobnego do tego, co Linq oferuje w .Net, gdzie można bezpośrednio zapytać o kolekcję – TCM

+0

@Nitesh, Niestety nie jest zaznajomiony z .NET. Ale nie możesz wysłać zapytania do kolekcji w Javie, tak jak w twoim przykładzie (mogą to być jakieś zewnętrzne frameworki lub biblioteki, które to robią). –

2

krótko: nie, nie można

długa: można napisać własną strukturę danych i hash/index pól obiektu jakiegoś bardziej efektywnego wyszukiwania. ale to nie jest lista, bardziej lub mniej.

8

Biblioteki o funkcjonalnych, dobrze funkcjonalnych funkcjach, takich jak functionaljava, zapewniają takie metody .

Musisz użyć własnej implementacji List, która jest niekompatybilna z natywnym programem Java (Array)List lub przekonwertować między tymi dwoma.

Przykład:

import fj.data.Java 
import fj.data.List 
import fj.F 

// Converting an ArrayList 
fj.data.List<SomeObject> objList2 = Java.ArrayList_List().f(objList); 

fj.data.List<SomeObject> filteredObjList = objList2.filter(new F<SomeObject, Boolean>() { 
    Boolean f(SomeObject c) { return c.id == 2; } 
}); 

// Converting back to ArrayList 
java.util.List<SomeObject> objList2 = Java.List_ArrayList().f(filteredObjList); 

Korzystając functionaljava na List przechodzące przez Państwa projektu byś uniknąć konwersji.

2

Prawdopodobnie to pomoże ktoś,

http://code.google.com/p/joquery/

obsługuje biblioteki następującą strukturę kodu

Filter<Dto> query = CQ.<Dto>filter(testList) 
    .where() 
    .property("id").eq().value(1); 
Collection<Dto> filtered = query.list(); 
Powiązane problemy