yink's studio

yink's world
Stay hungry, stay foolish.
  1. 首页
  2. 软构博客
  3. 正文

软构博客5——利用lambda表达式进行简化

2022年6月6日 264点热度 0人点赞 0条评论

在写软构实验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表达式会使得代码更加简洁。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2022年6月6日

yink

这个人很懒,什么都没留下

点赞
< 上一篇

文章评论

取消回复

COPYRIGHT © 2021 101.34.164.187. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS