问问题
4759 次
3 回答
6
您可以使用函数来提取列表并使用 concat 来展平列表。这导致了一个Iterable。
List<A> input;
Function<A, List<B>> t = new Function<A, List<B>>() {
@Override public List<B> apply(A input) {
return input.myListOfB;
}
};
Iterable<B> transform = Iterables.concat(Iterables.transform(input, t));
如果需要,您可以创建一个列表:
ImmutableList<B> asList = ImmutableList.copyOf(transform);
//or
List<B> newArrayList = Lists.newArrayList(transform);
注意:通常,类的公共字段是静态的、不可变的或私有的。其他一切都会给你带来麻烦。
于 2012-04-24T13:48:57.013 回答
4
如果你让 A 类实现了 Iterable,你可以使用 Iterables.concat()。
public class A
implements Iterable<B>
{
public List<B> myListOfB;
// from Iterable
public Iterator<B> iterator ()
{
return myListOfB.iterator();
}
}
然后:
List<A> listOfAs = ...;
Iterable<B> allBs = Iterables.concat(listOfAs);
把它放在另一个列表中:
List<B> listOfAllBs = Lists.newArrayList(allBs);
于 2012-04-24T13:52:40.293 回答
1
这个怎么样?我只是粗略地表达了我认为你的意思:
public static void main(String[] args) {
A a1 = new A();
a1.bs = Lists.newArrayList(new B("1"), new B("2"), new B("3"));
A a2 = new A();
a2.bs = Lists.newArrayList(new B("a"), new B("b"), new B("c"));
A a3 = new A();
a3.bs = Lists.newArrayList(new B("!"), new B("@"), new B("#"));
List<A> as = Lists.newArrayList(a1, a2, a3);
List<B> lettersAndNumbers = method(as, new Predicate<A>() {
@Override
public boolean apply(A input) {
for (B s : input.bs) {
if (s.bVal.matches("^[a-zA-Z0-9]*$")) {
return true;
}
}
return false;
}
});
System.out.println("as : " + lettersAndNumbers);
}
static List<B> method(List<A> as, Predicate<A> pred) {
List<B> newbs = Lists.newArrayList();
Iterable<A> filtered = Iterables.filter(as, pred);
for (A a : filtered) {
newbs.addAll(a.bs);
}
return newbs;
}
class A {
List<B> bs;
@Override
public String toString() {
return "A{" + bs.toString() + "}";
}
}
class B {
String bVal;
B(String bVal) {
this.bVal = bVal;
}
@Override
public String toString() {
return "B{" + bVal + "}";
}
}
于 2012-04-24T07:19:45.987 回答