在函数式编程语言中,函数是一级公民。如同你可以将数字传递给方法,也可以让方法产生数字一样,函数不仅可以作为参数,也可以作为返回值。这听起来好像有点抽象,在JAVA编码中,我们好像也很少这样子写到,但是还是很有必要理解这种设计,特别是在1.8之后的java中。
现在来看下面的代码示例:
一般来说,不要不敢编写返回函数的方法。这对于自定义函数非常有用。举个例子,Arrays.sort()方法带有一个Comparator参数,因为有很多方法都可以用来比较2个值,所以我们当然也可以按照自己的算法来编写一个返回比较器的方法,这样子就可以将自己写的比较器作为参数传入到Arrays.sort()方法中了。看下面的代码:
现在来看下面的代码示例:
public class Linkin { // 编写一个静态方法,对str这个字符串做一元操作 public static String handleStr(String str, UnaryOperator<String> function) { return function.apply(str); } // 编写一个方法,该方法返回一个函数式编程,这个模拟它里面封装了一个一元操作 public static UnaryOperator<String> function(String str) { System.out.println(str); return String::toLowerCase; } public static void main(String[] args) { // 1,现在我们来分开处理2次字符串的算法 System.out.println(handleStr("测试字符串a", (str) -> str.substring(0, 2))); System.out.println(handleStr("测试字符串B", String::toLowerCase)); // 2,现在我们来统一处理一次字符串的算法 System.out.println(handleStr("测试C字符串C", (str) -> { return str.substring(0, 4).toLowerCase(); })); // 3,假设我现在不能明确的知道这个算法,后者是这个算法是别人写的, // 那么就可以这样子来设计,其他人自己是重写function方法就好了 System.out.println(handleStr("AAABBB", function("这里表示算法中其他的操作"))); } }
一般来说,不要不敢编写返回函数的方法。这对于自定义函数非常有用。举个例子,Arrays.sort()方法带有一个Comparator参数,因为有很多方法都可以用来比较2个值,所以我们当然也可以按照自己的算法来编写一个返回比较器的方法,这样子就可以将自己写的比较器作为参数传入到Arrays.sort()方法中了。看下面的代码:
public class Linkin { public static void main(String[] args) { String[] array = { "1", "11", "111" }; Arrays.sort(array, new MyComparator()); Arrays.stream(array).forEach(System.out::println); } } class MyComparator implements Comparator<String> { @Override public int compare(String o1, String o2) { System.out.println("这里表示其他的操作!"); return (o1.length() < o2.length()) ? -1 : ((o1.length() == o2.length()) ? 0 : 1); } }
风流子弟曾少年,多少老死江湖前。。。