1、lambda表达式语法
Java8的lambda表达式简化了java的匿名类,lambda表达式允许你通过表达式来代替功能接口。
//java8之前创建匿名线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("java8之前");
}
});
//java8之后
new Thread(() -> System.out.println("java8函数式接口"));
如上代码,语法是:(parameters) ->{ statements; }
- 参数如果只有一个可省略括号:x -> x+2;
- 如果主体包含了一个语句,就不需要使用大括号
- 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值
2、举个栗子
List<String> list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
------遍历------
//java8之前
for(String string : list){
System.out.println(string);
}
//java8之后
list.forEach(a -> System.out.println(a));
//双冒号操作符
list.forEach(System.out::println);
-----
3、函数式接口
Lambda表达式是依赖函数式接口的,Lambda的类型就是函数式接口。java内置了4种函数式接口
接口类型 | 接口 | 参数 | 返回类型 | 用途 |
---|---|---|---|---|
消费型接口 | Consumer | T | 无返回值 | 对T类型对象应用操作,accept(T)方法 |
供给型接口 | Supplier | 无 | T | 返回类型为T的对象,get()方法 |
函数型接口 | Function | T | R | 对T类型对象应用操作,返回R型对象,apply(T)方法 |
断言型接口 | Predicate | T | Boolean | 对T类型对象应用操作,返回Boolean类型,test(T)方法 |
----消费型接口----
public static void main(String[] args) {
test(100.00,x -> System.out.println("消费:" + x));
}
//消费型接口
public static void test(Double money, Consumer<Double> consumer){
consumer.accept(money);
}
----供给型接口----
public static void main(String[] args) {
test(() -> "Supplier");
}
//供给型接口
public static void test(Supplier<String> supplier){
supplier.get();
}
----函数型接口----
public static void main(String[] args) {
test("123",x -> Integer.valueOf(x));
}
//函数型接口
public static void test(String string,Function<String,Integer> function){
function.apply(string);
}
----断言型接口----
public static void main(String[] args) {
test(123,x -> x > 100);
}
//断言型接口
public static void test(Integer integer,Predicate<Integer> predicate){
predicate.test(integer);
}
4、自定义函数式接口
函数式接口只有一个抽象方法,所以可以根据Lambda表达式确定方法。
//FunctionalInterface检查接口是否是一个函数式接口,非必须
@FunctionalInterface
public interface MyFunction<T> {
T apply();
}
public static void main(String[] args) {
MyFunction<String, Integer> myFunction = x -> String.valueOf(x);
myFunction.apply(123);
}