LinkinPark
当你的才华撑不起你野心时,那么请潜下心继续学习,心无旁骛,愿多年以后你们我都能成为自己想象的模样。
在函数式编程语言中,函数是一级公民。如同你可以将数字传递给方法,也可以让方法产生数字一样,函数不仅可以作为参数,也可以作为返回值。这听起来好像有点抽象,在JAVA编码中,我们好像也很少这样子写到,但是还是很有必要理解这种设计,特别是在1.8之后的java中。

现在来看下面的代码示例:
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);
	}
}


posted on 2015-11-23 14:48  LinkinPark  阅读(420)  评论(0编辑  收藏  举报