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;
    }
}

编辑2:

我将在 Dummy 中只有 2 个字符串,这样做会更好ArrayList<String []>吗?在记忆方面

4

6 回答 6

2

在 Java 8 之前的版本中,您可以使用其中一种功能性惯用语 API,例如 Guava,如下所示:

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) );

同意这是非常丑陋和冗长的,当 Guava 团队说滥用功能习语让他们哭泣时,他们所指的是一些东西。

但是等等,有希望,并且有一种方法可以使用开源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 不是字符串,它也可以工作,正如我在示例中所示。现在,您可以将它用于除 Dummy 之外的任何类型,以及使用 getter 方法的任意数量的字段,通过使用 Funcito 快速生成包装适当方法的函数。如果您愿意,Funcito 还可以与 Guava 以外的一些替代功能 API 一起使用。

请注意,以上使用来自 Guava 的导入和来自 Funcito 的静态导入。

于 2012-06-22T23:06:46.920 回答
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 回答
1

是的,你是对的,你需要扩展 ArrayList 来做到这一点。

于 2012-06-22T19:38:48.200 回答
0

快速扩展 ArrayList 变得站不住脚,因为您最终需要一个 MoronArrayList、一个 GeniusArrayList、一个 DummyHashMap、一个 DummyQueue 等......

@missingfaktor 建议的番石榴是一种选择。另一种选择,如果确实经常需要,则将实用方法放在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 回答
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 回答