90

想象一下,我有一个特定对象的列表:

List<Student>

我需要生成另一个列表,包括上面列表中的idsof :Students

List<Integer>

避免使用循环,是否可以通过使用apache 集合guava来实现这一点?

哪些方法应该对我的情况有用?

4

7 回答 7

192

Java 8 的做法:-

List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
于 2015-05-08T18:21:10.860 回答
42

使用 Guava,您可以使用以下功能 -

private enum StudentToId implements Function<Student, Integer> {
        INSTANCE;

        @Override
        public Integer apply(Student input) {
            return input.getId();
        }
    }

您可以使用此功能将学生列表转换为 id,例如 -

Lists.transform(studentList, StudentToId.INSTANCE);

它肯定会循环以提取所有 id,但请记住 guava 方法返回视图,并且仅在您尝试迭代时应用 FunctionList<Integer>
如果您不迭代,它将永远不会应用循环。

注意:记住这是视图,如果您想多次迭代,最好将内容复制到其他List<Integer>类似

ImmutableList.copyOf(Iterables.transform(students, StudentToId.INSTANCE));
于 2012-06-11T07:37:02.160 回答
22

感谢Premraj提供了另一种很酷的选择,点赞。

我使用了 apache CollectionUtils 和 BeanUtils。因此,我对以下代码的性能感到满意:

List<Long> idList = (List<Long>) CollectionUtils.collect(objectList, 
                                    new BeanToPropertyValueTransformer("id"));

值得一提的是,我将比较我上面使用的 guava(Premraj提供)和 collectionUtils 的性能,并决定哪个更快。

于 2012-06-11T16:45:33.457 回答
9

Java 8 lambda 表达式解决方案:

List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
于 2017-03-22T09:04:05.960 回答
6

如果有人在几年后来到这里:

List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
于 2015-04-14T02:55:56.110 回答
0

您可以为此目的使用Eclipse Collections

Student first = new Student(1);
Student second = new Student(2);
Student third = new Student(3);

MutableList<Student> list = Lists.mutable.of(first, second, third);
List<Integer> result = list.collect(Student::getId);

System.out.println(result); // [1, 2, 3]
于 2021-05-04T21:31:28.853 回答
-6

如果没有循环,在数学上是不可能做到这一点的。为了创建一个离散值集到另一个离散值集的映射 F,F 必须对原始集中的每个元素进行操作。(基本上,需要一个循环来执行此操作。)

话虽如此:

为什么需要新列表?您可能正在以错误的方式解决您正在解决的任何问题。

如果您有 的列表Student,那么在遍历此列表时,您只需一两步即可遍历学生的 ID 号。

for(Student s : list)
{
    int current_id = s.getID();
    // Do something with current_id
}

如果您有其他类型的问题,请评论/更新问题,我们会尽力帮助您。

于 2012-06-11T07:52:36.380 回答