Представьте, что у меня есть список определенных объектов:
List<Student>
И мне нужно создать еще один список, включая ids
из Students
приведенного выше списка:
List<Integer>
Можно ли этого добиться, избегая использования цикла, используя коллекции apache или guava ?
Какие методы должны быть полезны в моем случае?
java
list
collections
java-stream
guava
Джаватар
источник
источник
Ответы:
Java 8 способ сделать это: -
источник
С Guava вы можете использовать такие функции, как -
private enum StudentToId implements Function<Student, Integer> { INSTANCE; @Override public Integer apply(Student input) { return input.getId(); } }
и вы можете использовать эту функцию для преобразования списка студентов в идентификаторы, например -
Конечно, он будет зацикливаться, чтобы извлечь все идентификаторы, но помните, что методы guava возвращают представление, а функция будет применяться только при попытке перебора.
List<Integer>
Если вы не выполняете итерацию, цикл никогда не будет применяться.
Примечание: помните, что это представление, и если вы хотите повторить несколько раз, будет лучше скопировать содержимое в какой-то другой,
List<Integer>
напримеристочник
Благодаря Премраджу за альтернативный крутой вариант, проголосовали за.
Я использовал apache CollectionUtils и BeanUtils. Соответственно, меня устраивает выполнение следующего кода:
List<Long> idList = (List<Long>) CollectionUtils.collect(objectList, new BeanToPropertyValueTransformer("id"));
Стоит упомянуть, что я сравню производительность guava ( предоставляется Premraj ) и collectionUtils, которые я использовал выше, и выберу более быстрый.
источник
Identifiable
который определяетgetId()
метод, а затем вы можете использовать этот одиночный шаблон перечисления для общего извлечения идентификатора.Решение лямбда-выражения Java 8:
источник
Если кто-то попадет сюда через несколько лет:
List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
источник
Математически это невозможно сделать без цикла. Чтобы создать отображение F дискретного набора значений в другой дискретный набор значений, F должен работать с каждым элементом в исходном наборе. (Для этого в основном требуется цикл.)
Что, как говорится:
Зачем вам новый список? Вы можете неправильно подходить к решению любой проблемы.
Если у вас есть список
Student
, то при итерации по этому списку вам останется всего один-два шага от перебора идентификационных номеров учеников.for(Student s : list) { int current_id = s.getID(); // Do something with current_id }
Если у вас возникла проблема другого рода, прокомментируйте / обновите вопрос, и мы постараемся вам помочь.
источник