4

私が持っているとしましょう

class Dummy {
    String a, b;
    public Dummy(String a, String b) {
        this.a = a;
        this.b = b;
    }
    public String toString(){
        return a+b;
    }
    public String getA() {
        return a;
    }
    public String getB() {
        return b;
    }

}

私はを頂きたい

List<Dummy> myList = new ArrayList<Dummy>() {{
     add(new Dummy("test", ""));
     add(new Dummy("boo", "o"));
}};

System.out.println( myList.toString());
System.out.println( myList.getAs());  //should return ["test", "boo"]
System.out.println( myList.getBs());//should return ["", "o"]

あなたが私が何を意味するか見れば

おそらく拡張クラスを作成する必要がありますArrayList<Dummy>か?

編集:

そのように良さそうです

class Dummy {
    String a, b;
//...
    public static String toAString(List<Dummy> l){
       String s="";
       for (Dummy d : l){
           s+=d.a;
       }
       return s;
    }
}

edit2:

ダミーには2つの文字列しかありませんが、ArrayList<String []>どちらかと言えば良いですか?メモリの観点から

4

6 に答える 6

2

getAとに対応する第一級関数を定義しgetBます。そのためにグアバFunctionから使用しています。

class Dummy {
    String a, b;
    public Dummy(String a, String b) {
        this.a = a;
        this.b = b;
    }
    public String toString(){
        return a+b;
    }
    public String getA() {
        return a;
    }
    public String getB() {
        return b;
    }
    public static Function<Dummy, String> getA = new Function<Dummy, String>() {
      public String apply(Dummy d) {
        return d.a;
      }
    }
    public static Function<Dummy, String> getB = new Function<Dummy, String>() {
      public String apply(Dummy d) {
        return d.b;
      }
    }
}

これがあなたの使い方です:(Iterables以下もGuavaからのものです)。

List<Dummy> myList = new ArrayList<Dummy>() {{
     add(new Dummy("test", ""));
     add(new Dummy("boo", "o"));
}};

System.out.println( myList.toString());
System.out.println( Iterables.transform(myList, Dummy.getA)); // returns ["test", "boo"]
System.out.println( Iterables.transform(myList, Dummy.getB)); // returns ["", "o"]
于 2012-06-22T22:29:08.280 に答える
2

Java 8より前では、Guavaのような機能的なイディオムAPIの1つを次のように使用できます。

Function<Dummy, String> getAFunc = new Function<Dummy, String> {
    @Override
    public String apply(Dummy dummy) {
        return dummy.getA();
    }
}

Function<Dummy, String> getBFunc = new Function<Dummy, String> {
    @Override
    public String apply(Dummy dummy) {
        return dummy.getB();
    }
}

System.out.println( Lists.transform(myList, getAFunc) );
System.out.println( Lists.transform(myList, getBFunc) );

これはかなり醜く冗長であり、機能的なイディオムの誤用が彼らを泣かせると彼らが言うときにグアバチームが言及するもののいくつかに同意しました。

しかし、待ってください。オープンソースのFuncitoライブラリを使用して、このコードをよりエレガントで短く、このような状況に一般化する方法があります(免責事項:私は主な著者です)

今では代わりにあなたは単に書くことができます

Function<Dummy, AType> getAFunc = functionFor( callsTo(Dummy.class).getA() );
Function<Dummy, BType> getBFunc = functionFor( callsTo(Dummy.class).getB() );

System.out.println( Lists.transform(myList, getAFunc) );
System.out.println( Lists.transform(myList, getBFunc) );

簡潔にするための鍵は、Funcitoを使用して関数を構成することです。例で示したように、AとBが文字列ではないと仮定しても機能します。これで、Funcitoを使用して適切なメソッドをラップする関数をすばやく生成することにより、ダミー以外の任意のタイプ、およびgetterメソッドを使用する任意の数のフィールドにこれを使用できます。また、必要に応じて、FuncitoはGuava以外のいくつかの代替機能APIでも動作します。

上記はGuavaからのインポートとFuncitoからの静的インポートを使用していることに注意してください。

于 2012-06-22T23:06:46.920 に答える
1

はい、その通りです。これを行うには、ArrayListを拡張する必要があります。

于 2012-06-22T19:38:48.200 に答える
0
      List<Dummy> myList = new ArrayList<Dummy>() 
      myList.add(new Dummy("test", ""));     
      myList.add(new Dummy("boo", "o")); 


                     for(Dummy dumdum : myList) {
                     System.out.println(dumdum.getA() + " " + dumdum.getB());
                      }

これはあなたが探しているものですか、それとも私はあなたの質問を誤解していますか?

于 2012-06-22T19:45:07.857 に答える
0

継承の代わりに構成を使用する.............。

同じパッケージ内のすべてのクラスを考慮します。

Dummy Class:

class Dummy {
    String a, b;
    public Dummy(String a, String b) {
        this.a = a;
        this.b = b;
    }
    public String toString(){
        return a+b;
    }
    public String getA() {
        return a;
    }
    public String getB() {
        return b;
    }

}

Test Class: 編集済み

public class Test{
 Test t = new Test();                   
 List<Dummy> myList = new ArrayList<Dummy>();
 public static void main(String[] args){
 t.myList.add(new Dummy("test", ""));
 t.myList.add(new Dummy("boo", "o"));
for (Dummy d : t.myList)
{
  System.out.println(d.toString());
  System.out.println(d.getA());  
  System.out.println(d.getB()); 
  }
 } 
}
于 2012-06-22T19:48:45.397 に答える
0

最終的にはMoronArrayList、GeniusArrayList、DummyHashMap、DummyQueueなどが必要になるため、ArrayListを拡張するとすぐに使用できなくなります。

@missingfaktorによって提案されたGuavaのものは1つのオプションです。別のオプションとして、これが本当に頻繁に必要な場合は、ユーティリティメソッドをDummyクラスに配置します。例えば

public static String toAStrings(Collection<Dummy> collection) {
   StringBuilder sb = new StringBuilder;
   boolean firstTime = true;
   for (Dummy dummy : collection) {
      if (!firstTime )
         sb.append(",");
      firstTime = false;
      sb.append(dummy.getA());
   }

   return sb.toString();
}
于 2012-06-22T22:37:59.893 に答える