3

我必须继续编写比我想要的更长的代码,而且我必须这样做很多次。

Collection<MiClase> collection1 = new ArrayList<MiClase>;
Collection<String> collection2 = new ArrayList<String>;
// I currently do this
for (MiClase c : collection1){
    collection2.add(c.nombre()); // nombre() returns String
}

有什么可以让它更短的吗?

// I want something like
collection2.addAll(collection1, MiClase.nombre);
4

3 回答 3

5

没有内置的 java 函数可以做到这一点¹。你可以使用番石榴' Collections2#transform(collection, function) '

所以,你的代码看起来像

// nombres = collections2, miClasses = collection1
nombres.addAll(Collections2.transform(miClasses, new Function() {
    @Override
    public String apply (MiClasse miClasse) {
        return miClasse.nombre();
    }
}));

但这真的很麻烦,而且仅仅为了删除一个简单的循环可能有点过头了。

编辑

1 - 正如 ARS 所指出的,在 Java 8 lambda 表达式和改进的集合 API 之前没有内置。一些很酷的例子的链接:http ://www.javabeat.net/2012/05/enhanced-collections-api-in-java-8-supports-lambda-expressions/

于 2013-05-25T18:17:38.517 回答
2

更多的是为了完整性...

您可以使用反射编写一个方法来执行此操作:

static <A,B> void addAll(Collection<B> dest, Collection<A> source, String methodName)
      throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
{
  for (A a: source)
  {
    // can optimize this to only get method once if all objects have same type
    Method m = a.getClass().getMethod(methodName);
    dest.add((B)m.invoke(a));
  }
}

用法/示例:

ArrayList<String> s = new ArrayList<String>();
List<Integer> i = Arrays.asList(1,2,3);
addAll(s, i, "toString");
System.out.println(s);

如果您愿意,也可以添加方法参数。

测试

为什么我会>>不<<推荐它

如果抛出 3 个异常还不让你担心......(当然,你可以try- catch,但完全避免异常)

(人为)失败的几点:(这些都会显示为运行时错误,但首选编译时错误)

  • 方法名称拼写错误
  • 该方法甚至不存在
  • 该方法不返回类型的对象B
于 2013-05-25T18:50:49.797 回答
0

几种使用方法中的两种Stream API

为了,

Collection<MiClase> collection1 = new ArrayList<>;
Collection<String> collection2 = new ArrayList<>;

MiClase#nombre返回StringOP 提到的:

collection1.stream()
        .map(MiClase::nombre)
        .collect(Collectors.toList())
        .forEach(collection2::add);

或者

collection2.addAll(collection1.stream()
        .map(MiClase::nombre)
        .collect(Collectors.toList()));
于 2018-08-05T08:49:12.570 回答