我正在寻找一种将回调方法应用于String数组中每个元素的简单方法。例如在PHP中,我可以像这样在数组中创建所有元素:
$array = array_map('strtolower', $array);
在Java中有一种简单的方法可以实现这一点吗?
答案 0 :(得分:7)
首先,Java中的对象数组远远不如List
,所以如果可能的话,你应该真正使用它们。您可以使用String[]
创建List<String>
Arrays.asList
的视图。
其次,Java还没有lambda表达式或方法引用,所以没有很好的方法可以做到这一点......并且通过名称String
引用方法是非常容易出错且不是很好想法。
那就是说,Guava提供了一些基本的功能元素,可以让你做你想做的事情:
public static final Function<String, String> TO_LOWER =
new Function<String, String>() {
public String apply(String input) {
return input.toLowerCase();
}
};
// returns a view of the input list with each string in all lower case
public static List<String> toLower(List<String> strings) {
// transform in Guava is the functional "map" operation
return Lists.transform(strings, TO_LOWER);
}
与创建新数组或List
并将每个String
的小写版本复制到其中不同,这不会在创建时迭代原始List
的元素,并且只需要很少的内存
使用Java 8,lambda表达式和方法引用应该最终添加到Java以及更高级函数的扩展方法,如map
,这使得这更容易(像这样):
List<String> lowerCaseStrings = strings.map(String#toLowerCase);
答案 1 :(得分:3)
没有使用内置功能的单行,但你可以通过遍历数组来匹配功能:
String[] arr = new String[...];
...
for(int i = 0; i < arr.length; i++){
arr[i] = arr[i].toLowerCase();
}
答案 2 :(得分:1)
你可以使用反射:
String[] map(java.lang.reflect.Method method, String[] array) {
String[] new_array = new String[array.length];
for (int i = 0; i < array.length; i++) new_array[i] = (String)method.invoke(null, new Object[]{array[i]});
return new_array;
}
然后你只需要在某处声明一个静态方法,并使用反射API获取对它的引用。