Java:将回调应用于数组值

时间:2010-10-26 22:02:12

标签: java

我正在寻找一种将回调方法应用于String数组中每个元素的简单方法。例如在PHP中,我可以像这样在数组中创建所有元素:

$array = array_map('strtolower', $array);

在Java中有一种简单的方法可以实现这一点吗?

3 个答案:

答案 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获取对它的引用。