如果您是一名Java程序员,并且有兴趣了解更多关于Java8Lambda的知识,那么在本文中,我们将更深入地了解lambda语法和用法。
Java中的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));
Lambda表达式在GUI编程中也非常有用,可以实现事件处理程序。下面是一个使用按钮单击处理程序的示例。
JButton button = new JButton("Click Me");
button.addActionListener(e -> System.out.println("Button clicked!"));
这是在Java8中使用lambdas的简要介绍。
自从Java8以来,lambdas让你的生活变得更轻松了吗?请在下面的评论中解释。
...它。谢天谢地,有很多googlechrome扩展可以帮你处理“跳过简介”按钮。 自动跳过简介 一旦安装,这个免费的浏览器扩展自动点击“跳过简介”按钮,只要它出现在您的网页浏览器。你所要做的就是去谷歌Chrome网上商店下载到...
...:-/-ACT数学:-/-什么是好的ACT分数? 费城史密斯学院简介: 费城史密斯学院成立于1877年,是一所四年制私立历史黑人学院,隶属于联合卫理公会。校园位于阿肯色州小石城,学生人数不到600人,健康的师生比例为10:1。费兰...
...14/16ACT英语:11/16ACT数学:14/16ACT数字的含义 莱恩学院简介: 莱恩学院成立于1882年,是一所四年制的私立基督教卫理公会圣公会学院,位于田纳西州杰克逊市,占地55英亩。孟菲斯大约80英里远。这所历史悠久的黑人学院支持...
...-/- 比较缅因州大学的ACT分数 缅因大学奥古斯塔分校简介: 缅因州奥古斯塔大学是缅因州公立大学系统中第三大学校。UMA成立于1965,作为奥罗诺缅因大学的分支机构,旨在为继续教育的学生寻求副学士学位。今天,这所大学...
...ACT数字意味着什么新罕布什尔大学ACT比较 里维尔大学简介: 里维埃大学(前身为里维埃学院)成立于1933年,由玛丽姐妹会介绍。这所天主教大学通过60多个学术项目提供副学士、学士、硕士和博士学位。商业、教育和护理...
...字意味着什么新罕布什尔州大学ACT比较 新英格兰学院简介: 新英格兰学院位于新罕布什尔州亨尼克尔市,距离康科德约15分钟车程,是一所私立硕士学位机构。波士顿往南一个半小时。康图库克河(Contookook River)上有着迷...
...:-/-ACT数学:-/-康涅狄格大学ACT分数比较 米切尔学院简介: 米切尔学院是一所小型私立文科学院,位于康涅狄格州新伦敦泰晤士河河口。占地68英亩的住宅区坐落在通往长岛湾海岸的断崖上,包括一个供学生使用的小型私人...
...径、足球 你可能也喜欢这些学校 约翰逊州立学院:简介 佛蒙特大学简介:GPA-SAT-ACT图 贝克尔学院:简介 本宁顿学院:概况| GPA-SAT-ACT图表 罗德岛大学简介:GPA-SAT-ACT图 麻州大学-洛厄尔:简介 青山学院简介 南缅因大学简介...
...字对阿肯色大学的ACT比较意味着什么 约翰·布朗大学简介: 约翰·布朗大学是一所基督教大学,位于阿肯色州西北角的一个小镇——斯洛阿姆斯普林斯,占地200英亩。费耶特维尔在东南约30英里处。这所大学有一个以基督为...