lambada 表达式 入门

Java Lambada 表达式 入门

简介

Lambada 表达式是什么?

匿名函数(也叫 lambda表达式)是一个不与标识符绑定的函数。匿名函数通常是被传递给高阶函数的参数,或者用于构造需要返回函数的高阶函数的结果,在函数只使用一次,或者使用次数有限的情况下,匿名函数在语法上可能比使用命名函数更简洁。

​ 匿名函数在函数式编程和其他具有一级函数的语言中无处不在,在这些语言中,匿名函数对函数类型的作用与升序函数对其他数据类型的作用相同。

为什么使用 Lambada 表达式?

  • 实现了函数式编程。所有新的基于JVM的语言都在他们的应用中利用了函数式范式的优势,但是在lambda表达式出现之前,程序员们只能使用面向对象编程(OOPS)。因此,lambda表达式使我们不用从头开始编写大量代码,而是从易于理解、充分测试及可靠的现有小块开始,最后将它们组合在一起以创建新代码。

    参考 《on java 8》函数式编程 :https://lingcoder.gitbook.io/onjava8/13-functional-programming

  • 使代码可读性强,更简洁。

    参考《对比讲解lambda表达式与传统接口函数实现方式》 :https://juejin.im/post/6844903989834694669

  • 易于使用 api 和库。使用lambda表达式设计的API可以更容易使用并支持其他API。

  • 实现对并行处理的支持。lambda表达式可以让我们编写并行处理,现在每个处理器都是多核处理器。

🌰 Lambada 表达式 语法

  • 标准语法
String[] arrays = {"I", "am", "handsome", "java", "boy", "over"};
Arrays.sort(arrays, (String m, String n) -> Integer.compare(m.length(), n.length()));
System.out.println(Arrays.toString(arrays));

lambda表达式的标准语法包括以下内容:

  1. (String m, String n) 用括号把参数括起来(单个或多个),用逗号分隔。
  2. ->箭头 可当做 产出的意思
  3. 箭头后面的都是方法体。

output:

[I, am, boy, java, over, handsome]

💡:

  • 如果从上下文中可以推断出参数的类型,则可以省略该类型。在上面的代码中,mn的类型可以推断为String,所以类型可以省略。这样就使代码更简洁,更像一个真正的lambda表达式。

    String[] arrays = {"I", "am", "handsome", "java", "boy", "over"};
    Arrays.sort(arrays, (m,  n) -> Integer.compare(m.length(), n.length()));
    System.out.println(Arrays.toString(arrays));
    
    • 特例,单一类型的参数推断可以这样写:

      String[] arrays = {"I", "am", "handsome", "java", "boy", "over"};
      Stream<String> stream = Stream.of(arrays);
      stream.forEach(x-> System.out.println(x));
      

      其中 x无括号,⚠️必须是单一参数

    • Lambada 表达式可以用 Java 8 的方法引用来代替。

      Stream<String> stream = Stream.of(arrays);
      stream.forEach(System.out::println);
      

      方法引用的结构:类名或对象名,后面跟 :: ,然后跟方法名称

  • 如果代码不能一行写完,可以用{}括起来。现在的代码应该明确包含一个返回语句

    String[] arrays = {"I", "am", "handsome", "java", "boy", "over"};
    Arrays.sort(arrays, (
         m,  n) -> {
      return Integer.compare(m.length(), n.length());
    });
    System.out.println(Arrays.toString(arrays));
    
  • 无参数的情况

    当一个函数没有参数时,我们也可以用 lambda 表达式。

    () -> {for(int i=0; i<10; i++) doSomthing();}
    

小结

​ Lambada 表达式 把函数式编程的概念引入了 java 8 中,使 javaer 不必始终用面向对象的方式来编写功能代码,使代码跟简洁易懂;但是 Lambada 本身是借助 inventorynamic 实现的(java 7 中引入),这很难说是好是坏。

摘自《on java 8》第十三章

https://lingcoder.gitbook.io/onjava8/13-functional-programming#ben-zhang-xiao-jie

​ Lambda 表达式和方法引用并没有将 Java 转换成函数式语言,而是提供了对函数式编程的支持。这对 Java 来说是一个巨大的改进。因为这允许你编写更简洁明了,易于理解的代码。

这些特性满足了很多羡慕Clojure、Scala 这类更函数化语言的程序员,并且阻止了Java程序员转向那些更函数化的语言(就算不能阻止,起码提供了更好的选择)。

但是,Lambdas 和方法引用远非完美,我们永远要为 Java 设计者早期的草率决定付出代价。特别是没有泛型 Lambda,所以 Lambda 在 Java 中并非一等公民。虽然我不否认 Java 8 的巨大改进,但这意味着和许多 Java 特性一样,它终究还是会让人感觉沮丧和鸡肋。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LMAO6688

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值