基本语法:
(parameters) -> expression
或
(parameters) ->{ statements; }
下面是Java lambda表达式的简单例子
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
方法引用
//静态方法引用
object::instanceMethod
或
//特定对象的方法引用
Class::staticMethod
或
//特定类的任意对象的方法引用
Class::instanceMethod
或
//构造器引用
Class::new
Arrays.sort(rosterAsArray, (a, b) -> Person.compareByAge(a, b));
//这样直接引用了一个已有方法在 Java8 中写为
Arrays.sort(rosterAsArray, Person::compareByAge);
//这两种方法在语义上是等价的。
- 静态方法引用
Arrays.sort(rosterAsArray, Person::compareByAge);
- 特定对象的方法引用
// Reference to an instance method of a particular object
class ComparisonProvider {
public int compareByAge(Person a, Person b) {
return a.getBirthday().compareTo(b.getBirthday());
}
}
ComparisonProvider myComparisonProvider = new ComparisonProvider();
Arrays.sort(rosterAsArray, myComparisonProvider::compareByAge);
- 特定类的任意对象的方法引用
// Reference to an instance method
// of an arbitrary object of a particular type
String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
- 构造器的引用
public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>> DEST transferElements(
SOURCE sourceCollection, Supplier<DEST> collectionFactory) {
DEST result = collectionFactory.get();
for (T t : sourceCollection) {
result.add(t);
}
return result;
}
// Lambda
Set<Person> rosterSetLambda = transferElements(roster, () -> {
return new HashSet<>();
});
Set<Person> rosterSet = transferElements(roster, HashSet::new);
Set<Person> rosterSet = transferElements(roster, HashSet<Person>::new);