如果您是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));
标签: