Java 8 Lambda 表达式示例

1,498 阅读1分钟
原文链接: www.oschina.net

为了更容易的了解lambda表达式,让我们先来看几个那lambda表达式和匿名内部类作比较的例子。在第一个例子中,我们会看到使用lambda表达式来实现一个 Comparator 接口。假设我们有一个Person 类,该类有一个name属性,并且,我们创建了一个Person类型的数组,名为persons。

Arrays.sort(persons, new Comparator() {

    @Override
    public int compare(Person first, Person second) {

        return first.getName().compareTo(second.getName());
    }
});

// 这也是一个标准的排序,但是有趣的是,它传入的是一个lambda表达式,而不是一个Comparator类型的对象
Arrays.sort(persons,(first, second) -> first.getName().compareTo(second.getName()));

注意到5行的代码被精简到了1行,这就是lambda表达式比匿名内部类漂亮的地方。接下来,让我们看一个用lambda表达式来实现 Runable 接口的例子。结果也是一样。

Runnable printer = new Runnable() {

    @Override
    public void run() {

        System.out.println("Hello, I’m inside runnable class...");
    }
};

printer.run();

printer = () -> System.out.println("Hello, I’m inside runnable lambda...");

printer.run();

为用户自定义的接口写lambda表达式也同样是间非常简单容易的事。下面的例子使用 Operator自定义接口,并且将lambda表达式的引用保存在了变量中,以便重用。

Operator addition = (op1, op2) -> op1 + op2;

System.out.println("Addition result: " + addition.operate(2, 3));

为了更深入的理解,这里有一个使用了代码块的lambda表达式的例子。

interface GenericOperator {

    TYPE operate(TYPE ... operands);
}

//使用了代码块的lambda表达式
GenericOperator multiply = numbers -> {

    int result = 0;

    for(int num : numbers)
        result *= num;

    return result;
};

System.out.println("Multiplication result: " + multiply.operate(2,3,4));

如上所示,代码块就如同一个普通方法的代码块,lambda表达式就如同一个方法,但是它更有意义。