java8lambdas简介

如果您是一名Java程序员,并且有兴趣了解更多关于Java8Lambda的知识,那么在本文中,我们将更深入地了解lambda语法和用法。...

如果您是一名Java程序员,并且有兴趣了解更多关于Java8Lambda的知识,那么在本文中,我们将更深入地了解lambda语法和用法。

java8-lambda-intro

Java中的lambda表达式是在表达式中表示类的方法的简洁方法。它有一个参数列表和一个主体。主体可以是单个表达式或块。它通常用于需要接口实现的地方。当需要一个接口作为调用方法的参数时,通常会出现这种需求。

一些简单的lambda表达式

让我们看看lambda表达式的一些简单示例。

下面是一个lambda表达式,它接受两个数字x和y并计算总和。

(int x,int y) -> x + y;

删除参数类型以获得更简洁的表示形式:

(x, y) -> x + y;

定义不接受参数的函数:

() -> 404;

以下也是有效的,它不接受任何参数,也不返回任何内容:

() -> {}

对于单个参数,不需要将参数括起来:

x -> x + 1

更复杂的代码块也是可能的。下面的lambda接受一个单行参数并对其进行一些处理。请注意,参数的类型是从周围上下文推断出来的:

line -> {
String[] x = pattern.split(line);
return new Player(Integer.parseInt(x[0]),
x[1],
x[2],
x[3],
Integer.parseInt(x[4]));
}

简洁明了的编码

使用lambda表达式有助于使代码简洁明了。为了帮助实现这一点,Java8类大量使用lambdas。

在列表或集合上循环

诸如List、Set、Queue之类的集合类实现了Iterable接口,这使得在元素上进行循环更加容易。

声明姓名列表。

List<String> names = Arrays.asList("Joe", "Jack", "James", "Albert");

不使用lambda循环列表:

for (String name : names) {
System.out.println(name);
}

使用lambda,可以将上述循环编写为:

names.forEach(name -> System.out.println(name));

使用Java 8方法引用,上述内容可以更简洁地写成:

names.forEach(System.out::println);

在地图上循环

映射是键到值的映射。在映射上循环涉及在每个(键、值)映射上循环。比较一下在这种情况下如何使用lambdas。

首先定义地图:

Map<String,Integer> map = new HashMap<>();
map.put("Atlanta, Georgia", 110);
map.put("Austin, Texas", 115);
map.put("Baltimore, Maryland", 105);
map.put("Birmingham, Alabama", 99);
map.put("Boston, Massachusetts", 98);

您可以用传统的方式在地图上循环:

for (Map.Entry<String,Integer> e : map.entrySet()) {
System.out.println(e.getKey() + " => " + e.getValue());
}

下面是如何使用lambdas以快速简洁的方式完成相同的操作:

map.forEach((k, v) -> System.out.println(k + " => " + v));

功能接口

lambda表达式的返回类型是什么?换句话说,在下面的语句中X的类型是什么?

X x = a -> a + 1;

lambda表达式的返回类型是一个函数接口-一个具有单个抽象方法的接口。可以使用兼容的抽象方法将lambda表达式指定给接口。下面是一些例子。

创建多线程任务

考虑创建一个在单独线程中执行的任务——您需要将任务定义为可运行接口并实现run()方法。这里Runnable是一个函数接口。

class MyTask implements Runnable {
...
public void run() {
// implement your task here
System.out.println("Running in a separate thread now.");
}
...
}

然后可以创建MyTask类的实例,并使用它来启动新的执行线程。

MyTask task = new MyTask();
Thread thread = new Thread(task);
thread.start();

使用lambda,创建Runnable的过程变得更加简单。上面的任务定义可以重写为:

Runnable task = () -> System.out.println("Running in a separate thread now.");

甚至:

Thread thread = new Thread(() -> System.out.println("Running in a separate thread now."));
thread.start();

使用比较器进行比较

比较器是一个功能接口,用于比较给定类型的对象。它定义了一个名为compare()的抽象方法,可以使用lambda表达式定义该方法。

下面是一个lambda表达式,它创建了一个用于不区分大小写地比较字符串的比较器。

Comparator<String> cmp = (x, y) -> x.compareToIgnoreCase(y);

一旦创建了比较器功能接口的实例,就可以根据需要重新使用它。

在这里,我们按升序对字符串列表进行排序。

List<String> names = Arrays.asList("Joe", "Jack", "James", "Albert");
Collecti***.sort(names, cmp);
names.forEach(System.out::println);
// prints
Albert
Jack
James
Joe

上面的列表已排序到位。我们现在可以使用binarySearch()方法进行搜索,如下所示:

System.out.println("search(Joe):" + Collecti***.binarySearch(names, "Joe", cmp));
# prints
search(Joe):3

从列表中计算最大值和最小值也很容易使用lambdas。

定义一些数据:

List<Integer> temps = Arrays.asList(110, 115, 105, 99, 98, 54, 109, 84, 81, 66, 72, 135, 115, 75, 82, 90, 88);

使用lambda表达式定义比较器:

Comparator<Integer> cmpTemp = (x, y) -> Integer.compare(x, y);

并打印最大值和最小值:

System.out.println("------ Max/Min ------");
System.out.println(Collecti***.max(temps, cmpTemp) + "/" + Collecti***.min(temps, cmpTemp));

在gui编程中的使用

Lambda表达式在GUI编程中也非常有用,可以实现事件处理程序。下面是一个使用按钮单击处理程序的示例。

JButton button = new JButton("Click Me");
button.addActionListener(e -> System.out.println("Button clicked!"));

这是在Java8中使用lambdas的简要介绍。

自从Java8以来,lambdas让你的生活变得更轻松了吗?请在下面的评论中解释。

  • 发表于 2021-03-12 08:09
  • 阅读 ( 240 )
  • 分类:编程

你可能感兴趣的文章

如何制作youtube简介(以及4个免费工具)

...介绍一些免费工具,这些工具将帮助您创建自己的YouTube简介。 ...

  • 发布于 2021-03-25 01:41
  • 阅读 ( 347 )

如何在googlechrome中自动跳过netflix简介

...它。谢天谢地,有很多googlechrome扩展可以帮你处理“跳过简介”按钮。 自动跳过简介 一旦安装,这个免费的浏览器扩展自动点击“跳过简介”按钮,只要它出现在您的网页浏览器。你所要做的就是去谷歌Chrome网上商店下载到...

  • 发布于 2021-03-31 22:38
  • 阅读 ( 279 )

费兰德史密斯学院招生

...:-/-ACT数学:-/-什么是好的ACT分数? 费城史密斯学院简介: 费城史密斯学院成立于1877年,是一所四年制私立历史黑人学院,隶属于联合卫理公会。校园位于阿肯色州小石城,学生人数不到600人,健康的师生比例为10:1。费兰...

  • 发布于 2021-09-17 01:43
  • 阅读 ( 160 )

莱恩学院招生

...14/16ACT英语:11/16ACT数学:14/16ACT数字的含义 莱恩学院简介: 莱恩学院成立于1882年,是一所四年制的私立基督教卫理公会圣公会学院,位于田纳西州杰克逊市,占地55英亩。孟菲斯大约80英里远。这所历史悠久的黑人学院支持...

  • 发布于 2021-09-17 01:45
  • 阅读 ( 131 )

缅因大学奥古斯塔招生

...-/- 比较缅因州大学的ACT分数 缅因大学奥古斯塔分校简介: 缅因州奥古斯塔大学是缅因州公立大学系统中第三大学校。UMA成立于1965,作为奥罗诺缅因大学的分支机构,旨在为继续教育的学生寻求副学士学位。今天,这所大学...

  • 发布于 2021-09-18 22:03
  • 阅读 ( 159 )

里维尔大学招生

...ACT数字意味着什么新罕布什尔大学ACT比较 里维尔大学简介: 里维埃大学(前身为里维埃学院)成立于1933年,由玛丽姐妹会介绍。这所天主教大学通过60多个学术项目提供副学士、学士、硕士和博士学位。商业、教育和护理...

  • 发布于 2021-09-18 23:01
  • 阅读 ( 170 )

新英格兰大学招生

...字意味着什么新罕布什尔州大学ACT比较 新英格兰学院简介: 新英格兰学院位于新罕布什尔州亨尼克尔市,距离康科德约15分钟车程,是一所私立硕士学位机构。波士顿往南一个半小时。康图库克河(Contookook River)上有着迷...

  • 发布于 2021-09-18 23:53
  • 阅读 ( 153 )

米切尔学院招生

...:-/-ACT数学:-/-康涅狄格大学ACT分数比较 米切尔学院简介: 米切尔学院是一所小型私立文科学院,位于康涅狄格州新伦敦泰晤士河河口。占地68英亩的住宅区坐落在通往长岛湾海岸的断崖上,包括一个供学生使用的小型私人...

  • 发布于 2021-09-19 00:24
  • 阅读 ( 140 )

林登州立大学招生

...径、足球 你可能也喜欢这些学校 约翰逊州立学院:简介 佛蒙特大学简介:GPA-SAT-ACT图 贝克尔学院:简介 本宁顿学院:概况| GPA-SAT-ACT图表 罗德岛大学简介:GPA-SAT-ACT图 麻州大学-洛厄尔:简介 青山学院简介 南缅因大学简介...

  • 发布于 2021-09-19 00:52
  • 阅读 ( 201 )

约翰·布朗大学招生

...字对阿肯色大学的ACT比较意味着什么 约翰·布朗大学简介: 约翰·布朗大学是一所基督教大学,位于阿肯色州西北角的一个小镇——斯洛阿姆斯普林斯,占地200英亩。费耶特维尔在东南约30英里处。这所大学有一个以基督为...

  • 发布于 2021-09-19 01:27
  • 阅读 ( 177 )
oyr07004
oyr07004

0 篇文章

相关推荐