Java8 Lambda表达式 (一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zl_momomo/article/details/83347361

前言

java8中有两个最值得学习的特性,Lambda表达式和Stream API

定义:Lambda表达式是一种简洁的语法定义代码块,可以在以后执行一次或多次。

由来:在此之前,在 Java 中传递一个代码段并不容易, 不能直接传递代码段 。Java 是一种面向对象语言,所以必须构造一个对象,这个对象的类需要有一个方法能包含所需的代码。java8通过lambda表达式来支持函数式编程。

基本lambda例子

public class LengthComparator implements Comparator<String> {

    @Override
    public int compare(String first, String second) {
        return first.length() - second.length();
    }

    public static void main(String[] args) {
        String[] strings = {"apple","back","cap","element"};
        Arrays.sort(strings,new LengthComparator());//{"cap","back","apple","element"}
    }
}

使用lambda表达式

Arrays.sort(strings,(String first,String second)->{return first.length() - second.length();});
//简化lambda表达式
Arrays.sort(strings,(first,second)->first.length() - second.length());

Lambda表达式语法

lambda 表达式形式:参数, 箭头(->) 以及一个表达式。无需指定 lambda 表达式的返回类型。lambda表达式的返回类型总是会由上下文推导得出。

1.如果代码要完成的计算无法放在一个表达式中,就可以像写方法一样,把这些代码放在 {}中, 并包含显式的 return语句

(String first, String second) ->
        {
            if (first.length() < second.length()) return -1;
            else if (first.length() > second.length()) return 1;
            else return 0;
        }

2.即使 lambda表达式没有参数, 仍然要提供空括号,就像无参数方法一样

() -> { for (int i = 100;i >= 0;i++ ) System.out.println(i); }

3.如果可以推导出一个 lambda 表达式的参数类型,则可以忽略其类型 (这里编译器可以推导出 first 和 second 必然是字符串)

Comparator<String> comp
                = (first, second) // Same as (String first, String second) 
                -> first.length() - second.length();

4.如果方法只有一参数, 而且这个参数的类型可以推导得出,那么甚至还可以省略小括号

ActionListener listener = event ->
                System.out.println("The time is " + new Date()");
// Instead of (event) -> . . . or (ActionEvent event) -> . . .

 

方法引用

使用双冒号分割方法名与对象或类名,主要有三种情况:

object:instanceMethod
Class:staticMethod
Class:instanceMethod

在前2种情况中,方法引用等价于提供方法参数的lambda表达式。System.out::println 等价于 x -> System.out.println(x) ,类似地,Math::pow 等价于(x,y) -> Math.pow(x, y)。 

对于第 3 种情况, 第 1 个参数会成为方法的目标。例如,String::compareToIgnoreCase 等 同于 (x, y) -> x.compareToIgnoreCase(y) 

构造器引用

与方法引用很类似,只不过方法名是new

下面例子中map 方法会为各个列表元素调用 Person(String) 构造器。如果有多个 Person 构造器, 编
译器会选择有一个 String 参数的构造器

ArrayList<String> names = . . .;
Stream<Person> stream = names.stream().map(Person::new);
List<Person> people = stream.col1ect(Col1ectors.toList());

可以用数组类型建立构造器引用。例如, int[]::new 是一个构造器引用,它有一个参数: 即数组的长度。这等价于 lambda 表达式 x -> new int[x]。 Java 有一个限制,无法构造泛型类型 T 的数组。

参考: java核心技术卷I 第六章 (第10版)

猜你喜欢

转载自blog.csdn.net/zl_momomo/article/details/83347361