在写软构实验2的时候,删除顶点的remove方法中我写出了这样一段代码,用途是只要起点或者终点与指定的顶点相同就删除该边。
Iterator<Edge<L>> iterator = edges.iterator(); while (iterator.hasNext()) { Edge<L> e = iterator.next(); if(e.getSource().equals(vertex) || e.getTarget().equals(vertex)) { iterator.remove(); } }
但是IDEA给出了提示,可以替换成这样一句话:
edges.removeIf(e -> e.getSource().equals(vertex) || e.getTarget().equals(vertex));
这里利用了ArrayList自带的removeIf的方法,但是参数的形式很有意思。经过查找资料,知道了这是lambda表达式,在java 8中发布,是很重要的特性,于是做了进一步了解。
首先,先搞清楚什么是lambda表达式。
lambda表达式类似于其它语言(例如js)中的匿名函数,作用主要是减少不必要的函数调用,同时简化代码,增加代码的可读性。(个人觉得简化代码的效果很显著)
形式有以下两种:
(parameters) -> expression
或 (parameters) ->{ statements; }
上面的removeIf就是用一个函数作为参数,e代表遍历变量,如果函数返回值为true,就删除这个元素(使用iterator实现)
用一个实际的问题举例子,下面是实现相同功能的两段代码:
public class Tester { interface MathOperation { int operation(int a, int b); } private int operate(int a, int b, MathOperation mathOperation) { return mathOperation.operation(a, b); } interface GreetingService { void sayGreeting(String message); } public static void main(String[] args) { Tester tester = new Tester(); MathOperation add = (int a, int b) -> (a + b); MathOperation sub = (int a, int b) -> (a - b); MathOperation mul = (int a, int b) -> (a * b); MathOperation div = (int a, int b) -> (a / b); System.out.println(tester.operate(10, 5, add)); System.out.println(tester.operate(10, 5, sub)); System.out.println(tester.operate(10, 5, mul)); System.out.println(tester.operate(10, 5, div)); GreetingService greetingService = (message -> System.out.println("hello" + message)); greetingService.sayGreeting("yink"); greetingService.sayGreeting("key"); } } // use lambda
public class Tester2 { private static int add(int a, int b) { return (a + b); } private static int sub(int a, int b) { return (a - b); } private static int mul(int a, int b) { return (a * b); } private static int div(int a, int b) { return (a / b); } private static void sayGreeting(String message) { System.out.println("hello" + message); } public static void main(String[] args) { System.out.println(add(10,5)); System.out.println(sub(10,5)); System.out.println(mul(10,5)); System.out.println(div(10,5)); sayGreeting("yink"); sayGreeting("key"); } } // doesn't use lambda
我们可以显著地看到lambda表达式的好处,也由此可以知道它什么时候应该应用。
首先,这四则运算很可能是只需要在main函数调用的。如果不用lambda表达式,就需要新定义类方法,这样会导致整个类显得臃肿,而且浪费(不需要定义成类方法)。所以,使用lambda表达式可以让这种函数变成一个局部变量的形式,也就是说“在该调用的地方才调用”,最大程度减少不必要的调用,也让类变得清爽。
同时,两者相比,使用lambda表达式的抽象程度增加了。假如以后还需要增加开方等相同类型的数学运算,可以以相同的方式进行调用。
lambda表达式其实并没有实现一个新功能,它可以被新定义一个函数的方式进行替代。但是,如果某个函数只使用一次,且调用处比较集中。或者就是把函数当做一个参数传入另一个函数中(比如前面的removeIf),就没有必要新定义一个函数,使用lambda表达式会使得代码更加简洁。
文章评论