假设我有一个像下面这样的豆子.
class Customer{
private String code;
private String name;
private Integer value;
//getters setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
然后从一个方法我得到一个List<Customer>回来.现在让我们说我想从列表中获取所有成员"名称"的列表.显然,我可以自己遍历并构建一个List<String>元素"名称".
但是,我想知道是否有一种捷径或更有效的方式来解决这种技术.例如,如果我想获取Map对象中所有键的列表,我会得到map.keySet().这条线上的东西是我想要找到的东西.
番石榴Lists.transform可以使用提供的(或更确切地说)List<F>将a 转换为a .List<T>Function<F,T>Function<? super F,? extends T>
从文档:
Run Code Online (Sandbox Code Playgroud)public static <F,T> List<T> transform( List<F> fromList, Function<? super F,? extends T> function )返回一个适用
function于每个元素的列表fromList.返回的列表是转换后的视图fromList; 更改fromList将反映在返回的列表中,反之亦然.该
function被懒惰地施加,在需要时调用.
类似的实时视图转换也提供如下:
Iterables.transform(Iterable<F>至Iterable<T>)Iterators.transform(Iterator<F>至Iterator<T>)Collections2.transform(Collection<F>至Collection<T>)Maps.transformValues(Map<K,V1>至Map<K,V2>)看起来你正在寻找与Perl map功能相当的Java .这种事情可能会被添加到集合库中一次(如果)Java接收闭包.在那之前,我认为这是你能做的最好的事情:
List<String> list = new ArrayList<String>(customers.size());
for ( Customer c : customers ) {
list.add(c.getName());
}
Run Code Online (Sandbox Code Playgroud)
您还可以编写一个map使用简单接口来提供映射功能的函数.像这样的东西:
public interface Transform<I, O> {
O transform(I in);
}
public <I, O> List<O> map(Collection<I> coll, Transform<? super I, ? extends O> xfrm) {
List<O> list = new ArrayList<O>(coll.size());
for ( I in : coll ) {
list.add(xfrm.transform(in));
}
return list;
}
Run Code Online (Sandbox Code Playgroud)