如何从对象的数组列表中获取子列表?

时间:2018-11-28 13:07:40

标签: java android arraylist

我必须从对象列表中获取字符串列表,但我认为循环遍历不是最好的方法。

说明:

人在:

public class Person{
    String name;
    String id;
}

我有一个方法的参数列表

public List<String> getNames(ArrayList<Person> people){}

我要在人员名单中列出姓名

在没有循环并添加到另一个列表的情况下最好的方法是什么?

5 个答案:

答案 0 :(得分:1)

如果您被允许在android中使用Java 8,则只需对列表执行map

public List<String> getNames(ArrayList<Person> people){
    return people.stream().map(a -> a.name).collect(Collectors.toList());
}

答案 1 :(得分:1)

public class Person{
    String name;
    String id;

    @Override
    public String toString() {
        return name;
    }
}

在方法中

public List<String> getNames(ArrayList<Person> people){
    return Arrays.asList((people.toString().replace("[","").replace("]","")).split(Pattern.quote(",")));
}

答案 2 :(得分:0)

这可能是您要寻找的答案:

System.out.println(Arrays.DeeptoString(people))

答案 3 :(得分:0)

  

在没有循环并添加到另一个列表的情况下最好的方法是什么?

将一个Iterable转换为另一个Iterable将涉及循环。

您可以在创建原始ArrayList<String>时将名称存储在另一个ArrayList<Person>中,但是相对于仅循环Person而言的优势却值得商

答案 4 :(得分:0)

如果您不想遍历List<Persons> people,则可以在列表上创建一个视图,该视图将以特定方式显示Person

public class ListView<L, T> extends AbstractList<T> {

    private List<L> original;
    private Mapper<L, T> mapper;

    private ListView(List<L> original, Mapper<L, T> mapper) {
        this.original = original;
        this.mapper = mapper;
    }

    @Override
    public T get(int index) {
        return mapper.map(original.get(index));
    }

    @Override
    public int size() {
        return original.size();
    }

    private static <L, T> ListView<L, T> of(List<L> original, Mapper<L, T> mapper) {
        return new ListView<>(original, mapper);
    }

}

Mapper是一个界面,它定义了我们如何查看Person

private static abstract interface Mapper<I, O> {

    O map(I input);

}

现在我们可以使用它来实现getNames

public List<String> getNames(ArrayList<Person> people) {
    return ListView.of(people, new Mapper<Person, String>() {

        @Override
        public String map(Person person) {
            return person.getName();
        }
    });
}

应用于示例:

ArrayList<Person> people = new ArrayList<>(Arrays.asList(new Person("Micky", "1"), new Person("Donald", "2"), new Person("Daisy", "3")));
List<String> names = getNames(people);
System.out.println(names); // [Micky, Donald, Daisy]

请注意:ListView的所示实现不支持修改。因此,它是只读的List。如果您不想在不添加Person的情况下添加名称,那么此实现就足够了。

使用Java 8将使代码更简单。但是您said不能。因此,这种方法没有Java 8功能。