Могу ли я запросить список? Джава - PullRequest
7 голосов
/ 17 мая 2010

Скажи, что у меня есть

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

Если someObject содержит поле с именем id. Можем ли мы найти его по какому-нибудь запросу типа

objList.filter('id=2');

без перебора списка? Если нет, то почему? Это может быть настолько полезным методом и использоваться как альтернатива написанию утомительного цикла?

Ответы [ 6 ]

8 голосов
/ 17 мая 2010

Библиотеки с функциональной, ну, функциональностью, такой как functionsjava , предоставляют такие методы.

Вам нужно будет использовать собственную реализацию List, которая несовместима с нативными Javas (Array)List или конвертировать между ними.

Пример:

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 );

Используя функционал List через ваш проект, вы избежите конвертации.

2 голосов
/ 22 июля 2013

Возможно, это кому-нибудь поможет,

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

эта библиотека поддерживает следующую структуру кода,

Filter<Dto> query = CQ.<Dto>filter(testList)
    .where()
    .property("id").eq().value(1);
Collection<Dto> filtered = query.list();
2 голосов
/ 17 мая 2010

коротко: нет, вы не можете

long: вы можете написать собственную структуру данных и хеш / индексные поля объекта для более эффективного поиска. но это не список, больше HashMap или около того.

2 голосов
/ 17 мая 2010

Даже если бы это была поддерживаемая функция языка, то итерации потребовалась бы Java, так что вы вернулись на круги своя (с точки зрения временной сложности).

Что вам нужно, так это ассоциативное картографирование. Этого можно достичь с помощью HashMap. Если вы хотите связать более чем с одним типом свойства, например, с идентификатором И ИДОМ, тогда вы можете создать два HashMaps, один с ключом id, а другой с ключом name.

Это, конечно, не очень хорошо масштабируется, если вы хотите запросить много свойств, поэтому следующим шагом будет использование объектно-ориентированной базы данных, такой как Hibernate, которая позволит вам запрашивать базу данных для объектов точно так же, как в вашем примере .

1 голос
/ 17 мая 2010

Если вы хотите что-то вроде linq для Java, посмотрите quaere


Редактировать: На данный момент quaere выглядит так, как будто он не поддерживается. Поскольку Java 7 является EOL, вы должны быть на Java 8, чей Stream API должен помочь вам в этом по сравнению с точечным синтаксисом Linq. См. эту страницу для некоторых примеров.

0 голосов
/ 27 марта 2014

Здесь Как вы запрашиваете коллекции объектов в Java (Criteria / SQL-like)? Вы можете увидеть несколько хороших вариантов / я на самом деле на этом не остановился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...