Java-8新特性:学习如何使用Lambda表达式(一,线程池的实现原理

HarmonyOS学习 2021-11-25 19:07:18
java 面试 编程语言 后端开发

class MyRunner implements Runnable {
public void run() {
for (int i = 0; i < 1000; i++)
doWork();
}

}

于是,当我们想要执行此代码时,就实例化一个MyRunner对象。然后,把实例放入线程池,或者只是启动一个新线程:

MyRunner r = new MyRunner();
new Thread.start();

总结一下整个场景:我把一段代码块传递给某人 - 线程池,排序方法或按钮。希望在适当时机需要时,他们调用我这段代码来进行排序。

在java8以前,想要传递代码块很不容易。我们只能把代码块写在一个特殊类里,然后实例化一个类对象来传递这段代码。

在其他语言中,例如C#,则可以直接使用代码块。java语言设计者多年来一直反对添加此功能。理由无非是想要保持语法的简单性和一致性。但却牺牲了编码便利性。

在下一节中,我们一起来了解如何在Java中使用代码块。

Lambdas的语法

让我们再次回到字符串排序。我们提供了确定哪个字符串更短的代码。我们计算

Integer.compare(firstStr.length(), secondStr.length())

这一行代码无非表达了一个意思,使用Integer.compare对firstStrsecondStr进入排序。

让我们用提问的方式来更明确的描述这个意思:

1、我们要处理的入参数数据是什么?是什么数据类型?

2、使用什么代码片断来对它们进行处理?

有了提问,回答就容易了。是对这样的入参数据进行处理(String firstStr, String secondStr),使用这样的 Integer.compare(firstStr.length(),secondStr.length()) 代码片断。

于是,有了我们第一个lambda表达式!此表达式指定代码块和必须传递给代码块的变量。

(String firstStr, String secondStr)
-> Integer.compare(firstStr.length(),secondStr.length())

还有一点历史…关于lambda这个名字的来历?很久以前,在计算机还没有出世的时候,数学家Alonzo Church想要形式化数学函数有效计算的意义。(有一些已知存在的函数,但没有人知道如何计算它们的值。)他使用希腊符号lambda(λ)来标记参数。从那以后,带有参数变量的表达式被称为“lambda表达式”。

Java lambda略有几种不同的形式。让我们更仔细地考虑一下。您刚刚看到其中一个:参数, - >箭头和表达式。如果代码包含的计算不适合单个表达式,那么就像编写方法一样编写它:将代码放入{}并添加显式return语句。例如,

(String firstStr, String secondStr) -> {
if (firstStr.length() < secondStr.length()) return -1;
else if (firstStr.length()

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

secondStr.length()) return 1;
else return 0;
}

如果lambda中没有参数,你仍然应该放置空括号,就像无参数方法一样:

() -> { for (int i = 0; i < 1000; i++) doSomething(); }

如果可以推断lambda的参数类型,则可以省略它们。例如,

Comparator<String> comp
= (firstStr, secondStr) // Same as (String firstStr, String secondStr)
-> Integer.compare(firstStr.length(),secondStr.length());

此时,编译器可以找出firstStr并且secondStr是字符串,因为我们将lambda分配给字符串比较器。(我们稍后会仔细研究这段代码。)

如果一个方法只有一个参数,编译器可以推导出是哪种类型,你甚至可以省略括号:

EventHandler<ActionEvent> listener = event ->
System.out.println(“The button has been clicked!”);
// Instead of (event) -> or (ActionEvent event) ->

此外,您可以像final方法参数一样,将修饰符和注释放在lambda参数中:

(final String var) -> …
(@NonNull String var) -> …

您永远不需要指定lambda表达式的结果类型。编译器总是从上下文中推断出它。例如,您可以使用lambda

(String firstStr, String secondStr) -> Integer.compare(firstStr.length(), secondStr.length())

其中int预期作为结果类型。

请注意,在lambda中,您不能返回不在分支中的值。例如,(int x) -> { if (x <= 1) return -1; }无效。

功能接口

像我们文章开头讨论的那样,Java可以借用接口来封装代码块,比如RunnableComparator。这对Lambdas同样适用。

在Java中有所谓的功能接口 - 一个只有单个抽象方法实现的接口对象。只要需要功能接口的对象,就可以使用lambda表达式。

让我们考虑一下Arrays.sort方法的例子。在这里我们可以看到用lambda替换功能接口。我们只是将lambda作为第二个参数传递给方法,该参数需要一个Comparator对象,该接口只有一个方法。

Arrays.sort(strs,
(firstStr, secondStr) -> Integer.compare(firstStr.length(), secondStr.length()));

实际上该Arrays.sort方法接收一些类实现的对象Comparator<String>compare调用该方法时,它会强制执行lambda表达式主体。这些对象和类的结构完全取决于实现。它不仅可以使用传统的内部类。也许最好将lambda表示为一个函数,而不是作为一个对象,并发现我们可以将它传递给一个功能接口。

这种对接口的转换是lambda表达式令人兴奋的原因。语法简短。这是另一个例子:

button.setOnAction(event ->
System.out.println(“The button has been clicked!”));

是不是很易读?

事实上,你在Java中使用lambda表达式唯一能做的就是转换。

Java API中的java.util.function包中有几个通用的功能接口。其中之一,BiFunction<T, U, R>代表与参数类型的函数TU和返回类型R。您可以将字符串比较lambda传给这样的变量:

BiFunction<String, String, Integer> compareFunc
= (firstStr, secondStr) -> Integer.compare(firstStr.length(), secondStr.length());

您可以在不同的Java 8 API中看到java.util.function中的这些接口。在Java 8中,任何功能接口都可以用@FunctionalInterface。这个注释是可选的,但却是一个很好的风格。首先,它强制编译器检查带注释的实体是否是具有单个抽象方法的接口。第二是告诉javadoc页面包含一个声明,这个接口是一个功能接口。根据定义,任何只有一个抽象方法的接口都是一个功能接口。但是,使用此关键字可以更加清晰。

最后

作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料

Java-8新特性:学习如何使用Lambda表达式(一,线程池的实现原理_后端开发
Java-8新特性:学习如何使用Lambda表达式(一,线程池的实现原理_面试_02

本文已被 CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

版权声明
本文为[HarmonyOS学习]所创,转载请带上原文链接,感谢
https://blog.51cto.com/u_15438507/4690505

  1. jQuery-实例方法
  2. jQuery-dom和jQuery,入口函数(基本知识)
  3. JavaScript-this指向问题
  4. JavaScript-封装与继承(两种)
  5. JavaScript-包装类型
  6. JavaScript-传值(引用类型,基本类型)
  7. JavaScript-面向对象(构造函数,实例成员,静态成员)
  8. JavaScript-解构赋值
  9. JavaScript-箭头函数
  10. JavaScript-参数
  11. JavaScript-预解析(变量提升)
  12. JavaScript-闭包closure
  13. JavaScript-声明变量的关键字
  14. JavaScript - mot - clé pour déclarer une variable
  15. Fermeture de fermeture JavaScript
  16. JavaScript Pre - parse (promotion des variables)
  17. Paramètres JavaScript
  18. Fonction de flèche JavaScript
  19. JavaScript - déconstruction assignations
  20. Common annotations in springboot
  21. Building CentOS 7.6 with Linux
  22. JavaScript - orienté objet (constructeur, membre d'instance, membre statique)
  23. JavaScript value Transfer (reference type, Basic type)
  24. JavaScript - type d'emballage
  25. linux deepin/ubuntu安装flameshot火焰截图
  26. JavaScript - encapsulation et héritage (deux)
  27. JavaScript JS method for writing 99 multiplication table
  28. 從零開始學java - 第二十五天
  29. Apprendre Java à partir de zéro - jour 25
  30. Les voitures d'hiver, les voitures électriques et les voitures à essence ne sont pas les mêmes?
  31. JavaScript - ceci pointe vers le problème
  32. Copie JavaScript
  33. Spring boot quickly integrates swagger
  34. linux deepin/ubuntu安裝flameshot火焰截圖
  35. Capture d'écran de flamme de l'installateur de flamme Linux deepin / Ubuntu
  36. Jquery DOM et jquery, fonctions d'entrée (bases)
  37. Méthode d'instance jquery
  38. Méthode et démonstration de code dans l'interface de liste en Java
  39. 【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )
  40. Démarrage du Zookeeper
  41. Java oom Cognition
  42. Java 开发者最困惑的四件事,值得一看!,BAT面试文档
  43. Java 将两个对象list里面的 某个字段值抽取到一个list里,java选择排序原理
  44. Java 多线程 —— 生产者消费者问题,从基础到深入案例
  45. Java 中设计模式 之 工厂模式,java反射机制的底层原理
  46. 【錯誤記錄】Java 中 ArrayList 排序 ( 使用 Comparator 接口時注意 compare 返回值是 -1 和 +1 )
  47. 【 enregistrement des erreurs 】 tri ArrayList en Java (Notez que les valeurs de retour de comparaison sont - 1 et + 1 lors de l'utilisation de l'interface de comparaison)
  48. Pourquoi Xiaopeng P5 est - il devenu un grand succès dans le cercle? Le Salon de l'automobile de Guangzhou montre encore des compétences polyvalentes
  49. Java 開發者最困惑的四件事,值得一看!,BAT面試文檔
  50. Les quatre choses les plus déroutantes pour les développeurs Java valent la peine d'être regardées! Document d'entrevue sur les MTD
  51. k8s-Pod污点与容忍
  52. k8s-Pod污点与容忍
  53. K8s POD Contamination and Tolerance
  54. K8s POD Contamination and Tolerance
  55. mysql常用语句——GROUP BY和HAVING
  56. Spring boot quickly integrates swagger
  57. mysql常用語句——GROUP BY和HAVING
  58. MySQL Common statements - group by and having
  59. Le défi du pinceau leetcode - Javascript: 110. Arbre binaire équilibré
  60. [notes d'apprentissage de première ligne] day44: XMLHttpRequest