Java 8 Lambdas快速入门

如果您是Java程序员,并且有兴趣了解有关Java 8 lambda的更多信息,那么在本文中,我们将仔细研究lambda的语法和用法。

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

一些简单的Lambda表达式

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

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

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

将参数类型放简洁的表示形式:

(x, y) -> x + y;

定义不接受任何参数的函数:

() -> 404;

以下内容同样有效,不接受任何参数且不返回任何内容:

() -> {}

否单个参数需要用括号括起来的参数:

x -> x + 1

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

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

干净简洁的编码

使用lambda表达式有助于使代码简洁明了。为此,Java 8类广泛使用了lambda。

集合类,例如 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);

Map 是键到值的映射。循环映射涉及循环遍历每个(键,值)映射。比较一下如何在此情景中使用lambda。

首先定义一个地图:

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表达式分配给接口。下面是一些示例。

考虑创建任务以在单独的线程中执行-您需要将任务定义为 Runnable 接口并实现 run()< / em>方法。 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();

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

这里是一个lambda表达式,用于创建 Comparator 在不区分大小写的情况下比较字符串。

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

创建了 Comparator 功能接口的实例后,可以根据需要重新使用它。

此处,我们将按升序对字符串列表进行排序。

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

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

System.out.println("search(Joe):" + Collections.binarySearch(names, "Joe", cmp));# printssearch(Joe):3

使用lambda,从列表中计算最大值和最小值也很容易。一些数据:

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(Collections.max(temps, cmpTemp) + "/" + Collections.min(temps, cmpTemp));

标签: