4
4

3 に答える 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 に答える