在函数式编程语言中,函数是一级公民。如同你可以将数字传递给方法,也可以让方法产生数字一样,函数不仅可以作为参数,也可以作为返回值。这听起来好像有点抽象,在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);
}
}

lambda高级进阶--返回函数的更多相关文章

  1. lambda高级进阶--组合函数

    只有一个参数的函数可以将一个值转换成另一个值,如果你有2个这样的转换函数,那么在进行一个转换之后在进行第二个转换,其实也是一个中转换. 说到这里,先说一下我个人的一个习惯,我在写javaBean的se ...

  2. Python高级教程-返回函数

    函数作为返回值 高阶函数除了可以接收函数作为参数外,还可以把函数作为结果值返回. 要实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 ...

  3. lambda高级进阶--表达式参数

    1,现在我们封装一个方法,来提供一个比较器,显然比较器是拥有两个参数的--用来比较的两个值. public class Linkin { public static String[] sort(Str ...

  4. C#高级进阶--重写函数

    这里要说一下,重写是继承时发生,在子类中重新定义父类中的方法.例如:基类方法声明为virtual方法,派生类中使用override声明此方法的重写. 基类中的访问修饰符在子类中是不能被修改的.比如说基 ...

  5. lambda高级进阶--延迟执行

    前面的整理我们也已经说到了,使用lambda表达式的主要原因是,将代码的执行延迟到一个合适的时间点.在使用lambda表达式的时候务必记住一点就是说lambda表达式都是延迟执行的. 延迟执行代码的原 ...

  6. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  7. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

  8. python函数进阶(函数参数、返回值、递归函数)

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...

  9. Python进阶-Ⅷ 匿名函数 lambda

    1.匿名函数的引入 为了解决那些功能很简单的需求而设计的一句话函数 def func(i): return 2*i # 简化之后 func = lambda i:2*i #todo 其中:func是函 ...

随机推荐

  1. asp.net core 2.0 查缺补漏

    asp.net core 2.0 一些有用有趣的设置. 面向(targeting)不同的.net版本: 打开asp.net core 2.0的项目文件: xxx.csproj, 这部分: <Pr ...

  2. git 删除分支操作

    删除分支时自己不能够在要删除的分支上 删除本地的某个分支 git branch -d branchname # 交互式删除分支 git branch -D branchname # 强制删除分支 删除 ...

  3. keepalived配置文件详解(2)

    全局配置 global_defs { notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个邮件地址 xuequn@.com } noti ...

  4. 将控制台信息显示在前台页面的js插件

    在拿出插件之前,先回顾一下apply()的用法,这里和call()做比较. JavaScript中的每一个Function对象都有一个apply()方法和一个call()方法,它们的语法分别为: /* ...

  5. CSRF跨站

    跨站请求伪造: 简单的说跨站请求伪造就是一些恶意的用户用自己的表单伪造网页实际的表单发送数据,接下来我就随便写一点: 跨站伪造的产生(form表单的methoud只有在等于post的时候才会有可能发生 ...

  6. SQL数据开发(经典) 基本操作

    数据开发(经典) 1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Str oke_ci_as ...

  7. position:absolute 的深入探讨

    position:absolute 参考谁进行定位的问题.之前大家可能会认为如果absolute元素的父级(祖父)元素没有设置position属性的时候,该元素的position:absolute会参 ...

  8. c语言函数实参与形参整理

  9. c++(爬楼梯)

    前两天上网的时候看到一个特别有意思的题目,在这里和朋友们分享一下: 有一个人准备开始爬楼梯,假设楼梯有n个,这个人只允许一次爬一个楼梯或者一次爬两个楼梯,请问有多少种爬法? 在揭晓答案之前,朋友们可以 ...

  10. Spring框架学习笔记(10)——Spring中的事务管理

    什么是事务 举例:A给B转500,两个动作,A的账户少500,B的账户多500 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用 一.注解添加事务管理方 ...