У меня есть список объектов, каждый из которых имеет логическое свойство «selected». Я хочу, чтобы они были в наборе, если свойство «selected» имеет значение true. За исключением цикла for через объекты, добавляющие каждый в набор, есть ли другой способ достичь этого?Простейший способ преобразования списка в набор на основе логического свойства?
ответ
Для чего-то это просто написать цикл и сделать с ним.
Если это шаблон, который вы собираетесь осуществить снова и снова:
(непроверенная, так что может быть опечатка или два)
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
знают, как исследовать объекты и решать, следует ли их хранить.
Обратите внимание на то, что вызов не менее типу, чем прямой цикл ... Java 8 принесет вам помощь. – Thilo
Также обратите внимание, как каждый раз, когда вам нужно использовать этот код, создается новый экземпляр селектора. Более того, новый класс создается для каждого раза, когда вам нужна такая итерация. Поэтому - я бы действительно советовал использовать простой цикл 'for'. – bezmax
Я просто должен согласиться с тем, что петли иногда являются наиболее эффективным методом. Cheers, – edwardmlyte
Для этого вы можете использовать любую функциональную библиотеку java. Например, из моего опыта с Lambdaj (http://code.google.com/p/lambdaj/):
Set<Entity> entitiesSet = new HashSet<Entity>(filter(having(on(Entity.class).getSelected(), equalTo(true)), entities));
Hm, я предполагаю, что вы ищете является функциональным подходом. Я бы порекомендовал взглянуть либо на lamdaj (если вы хотите придерживаться Java и вам нужен только API) или Scala (если вам нужен более богатый набор функций).
Пример
Императив версия:
List<Sale> salesOfAFerrari = new ArrayList<Sale>();
for (Sale sale : sales) {
if (sale.getCar().getBrand().equals("Ferrari"))
salesOfAFerrari.add(sale);
}
Вы можете сделать это в одной строке с lambdaj:
List<Sale> salesOfAFerrari = select(sales,
having(on(Sale.class).getCar().getBrand(),equalTo("Ferrari")));
Добавил небольшое пояснение к примеру (пример lambdaj был вторым). – rlegendi
если вы использовали 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.
Re; сборник литералов: http://stackoverflow.com/questions/2700775/why-collection-literals Действительно ли это сделать разрез для 7 или 8? – Thilo
@ Тило Я так не думаю о 7 – NimChimpsky
- 1. return boolean на основе логического свойства объекта
- 2. Простейший способ преобразования RGB в насыщенность
- 3. Подмножество объекта списка на основе логического оператора
- 4. сортировка связанного списка простейший способ
- 5. Самый простой способ преобразования списка в набор в Java
- 6. Простейший способ суммировать два списка в Scala?
- 7. Простейший способ создания выпадающего списка в MVC
- 8. Простейший способ обмануть свойства атрибута PostSharp
- 9. Получить элементы из одного списка на основе другого логического списка
- 10. Набор недвижимости на основе другого свойства
- 11. простой способ сортировки списка на основе максимального значения свойства
- 12. Простейший способ преобразования всех классов в строку в CSS
- 13. Простейший способ обработки списка элементов многопоточным способом
- 14. Простейший способ преобразования XML в HTML с XSLT в C#?
- 15. Сортировка списка флажков на основе проверенного свойства
- 16. Темы блокировки на основе логического значения
- 17. Простейший способ для преобразования объектов Java в XML
- 18. Простейший способ суммирования элементов 2D-массива на основе дубликатов?
- 19. Простейший способ локализации ключей реестра InstallShield
- 20. Простейший способ для преобразования списка номеров в читаемую строку в VBA
- 21. Как объединить два списка на основе свойства?
- 22. Лучший способ присвоить значение свойства динамически на основе имени свойства
- 23. Получение представления списка на основе свойства
- 24. тумблер Логического свойства в угловых
- 25. Понимание Логического свойства
- 26. .find() на основе логического ИЛИ два attributers
- 27. Каков эффективный способ фильтрации массива на основе логического состояния?
- 28. Фильтр множество наборов на основе логического выражения
- 29. преобразования плоского списка вложенного словаря на основе элементов из списка
- 30. преобразования Enum для логического типа
И вы хотите отобразить, с чего на что? –
Вы можете получить библиотеку для выполнения циклов и доступа к свойствам для вас (Google Guava может это сделать), но это не делает его другим (или гораздо более кратким для кода). – Thilo
Вы хотите иметь набор или карту? Если map, каково значение ключа? – dbf