質問する
4759 次
3 に答える
6
関数を使用してリストを抽出し、連結してリストをフラット化できます。これにより、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 に答える