项目中用到的 JDK 7、JDK 8 的新特性(2)Lambda 表达式

2、Lambda表达式

从 JDK 8 开始,Java 中引入了一个 FunctionalInterface 的概念。FunctionalInterface 即只定义了一个方法的接口,例如:

public interface Runnable {
    void run();
}
public interface Callable<V> {
    V call();
}
public interface Consumer<T> {
    void accept(T t);
}
public interface BiConsumer<T, U> {
    void accept(T t, U u);
}

等等。而 Lambda 表达式可以让我们用更少的代码来实现 FunctionalInterface 的匿名类。

例如:

Thread thread = new Thread(new Runnable() {
    @Override public void run() {
        doSomething();
    }
}

可以用 Lambda 表达式写为:

Thread thread = new Thread(() -> {
    doSomething();
});

如果代码块里只有一行代码,还可以省略掉大括号:

Thread thread = new Thread(() -> doSomething());

 

又例如:

Function<String, List<String>> function = new Function<>() {
    @Override public List<String> accept(String str) {
        list.add(str);
        return list;
    }
};

可以用 Lambda 表达式写为:

Function<String, List<String>> function = (str) -> {
    list.add(str);
    return list;
};

 

再例如:

Supplier<Set<String>> supplier = new Supplier<>() {
    @Override public Set<String> get() {
        return new HashSet<String>();
    }
};

可以用 Lambda 表达式写为:

Supplier<Set<String>> supplier = () -> {
    return new HashSet<String>();
};

由于代码块里只有一行代码,可以省略掉大括号和 return 关键字:

Supplier<Set<String>> supplier = () -> new HashSet<String>();

如果 lambda 表达式对应的 FunctionalInterface 的方法没有参数,而且方法体内直接调用一个类的无参构造方法来返回一个对象的话,还可以使用 Class::new 这样的语法进一步简化代码:

Supplier<Set<String>> supplier = HashSet::new;

 

上一篇:Python函数


下一篇:lambda函数的用法