我必须从对象列表中获取字符串列表,但我认为循环遍历不是最好的方法。
说明:
人在:
public class Person{
String name;
String id;
}
我有一个方法的参数列表
public List<String> getNames(ArrayList<Person> people){}
我要在人员名单中列出姓名
在没有循环并添加到另一个列表的情况下最好的方法是什么?
答案 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功能。