我正在使用 Java 7 ,我正在使用Guava API搜索将函数应用于数组的方法,而不必先将其转换为Collection。我愿意为此目的创建自己的课程,但我不想重新发明轮子嘿嘿。
所以作为总结(如果你不确切地知道我在说什么),这就是我到目前为止所发现的,你可以用Guava来将一个函数应用到数组中,因为我表示:
Integer[] someNumbers = new Integer[]{1, 2, 3};
Integer[] returnedNumbers = Collections2.transform(Arrays.asList(someNumbers), squareNumberFunction).toArray(new Integer[0]);
assertThat(returnedNumbers).isEqualTo(new Integer[]{1, 4, 9});//Using AssertJ here
但我希望能够做到这样的事情:
Integer[] someNumbers = new Integer[]{1, 2, 3};
Integer[] returnedNumbers = Arrays.transform(someNumbers, squareNumberFunction);
assertThat(returnedNumbers).isEqualTo(new Integer[]{1, 4, 9});
理想情况下,我所说的功能是类型安全。
修改
进一步澄清问题:
答案 0 :(得分:4)
好的,我最终编写了自己的代码以解决上述问题。所以我希望其他人也觉得它也很有用,而且不要只是求助于使用集合(来吧,你为什么要这么做?)。
public static <A, B> B[] transform(Class<B> theReturnedValueType, Function<A, B> functionToApply, A... theValues) {
B[] transformedValues = (B[]) Array.newInstance(theReturnedValueType, theValues.length);
for (int i = 0; i < theValues.length; i++) {
transformedValues[i] = functionToApply.apply(theValues[i]);
}
return transformedValues;
}
如何使用它的示例(实际上这是一个测试):
Integer[] returnedNumbers = ArrayTransformer.transform(Integer.class, squareNumberFunction, 1, 2, 3);
assertThat(returnedNumbers).isEqualTo(new Integer[]{1, 4, 9});
我想指出示例代码使用的是vargargs语法(这是一个测试,因此使用它是一种有趣的方式),但你可以显然传递一个数组对象。
另外,我必须补充一点,在对反射性能命中(例如Android)敏感的环境中使用它时需要小心这种方法,因为使用反射创建了新数组(java.lang。 reflect.newInstance(...))。另一方面,如果你使用toArray(T [])方法集合并且传递的数组的大小不足以容纳所有集合元素(在这种情况下在运行时分配新数组,则同样如此),就像我的代码一样),所以也许这个代码不代表一个问题,如果你按照我说的方式使用那个方法(无论如何你可以很容易地改变这个代码以满足你的需要)。
答案 1 :(得分:4)
不正确的是,数组比集合要快得多 - 有些集合只是数组的包装器,所以除了获得best of both worlds之外你什么都没有。
回到你的案例我认为你可以使用Arrays.asList
(你的数组支持的列表)或ImmutableList
(如果你不需要增长数组)适合你的任何东西,但不要# 39;使用数组。第一个迹象是你必须编写不必要的代码(你的答案以及将来会有更多),你将来必须维护/调整,根据我的经验,它不值得。
Java是一种更高级别的语言,出于各种原因,这种微小的优化应该更好地留给Java,但即便如此,如果你还有疑问,我建议你写一个微基准来验证你的假设。