Lambda表达式
可以认为是一种特殊的匿名内部类
lambda只能用于函数式接口。
lambda语法:
([形参列表,不带数据类型])-> {注意:
//执行语句
[return..;]
}
1、如果形参列表是空的,只需要保留()即可
2、如果没有返回值。只需要在{}写执行语句即可
3、如果接口的抽象方法只有一个形参,()可以省略,只需要参数的名称即可
4、如果执行语句只有一行,可以省略{},但是如果有返回值时,情况特殊。
5、如果函数式接口的方法有返回值,必须给定返回值,如果执行语句只有一句,还可以简写,即省去大括号和return以及最后的;号。
6、形参列表的数据类型会自动推断,只需要参数名称。
package com.lonly.test;
public class TestLambda {
public static void main(String[] args) {
TestLanmdaInterface1 t1 = new TestLanmdaInterface1() {
@Override
public void test() {
System.out.println("使用匿名内部类");
}
};
//与上面的匿名内部类执行效果一样
//右边的类型会自动根据左边的类型进行判断
TestLanmdaInterface1 t2 = () -> {
System.out.println("使用lambda");
};
t1.test();
t2.test();
//如果执行语句只有一行,可以省略大括号
TestLanmdaInterface1 t3 = () -> System.out.println("省略执行语句大括号,使用lambda");
t3.test();
TestLanmdaInterface2 t4 = (s) -> System.out.println("使用lambda表达式,带1个参数,参数为:"+s);
t4.test("字符串参数1");
TestLanmdaInterface2 t5 = s -> System.out.println("使用lambda表达式,只带1个参数,可省略参数的圆括号,参数为:"+s);
t5.test("字符串参数2");
TestLanmdaInterface3 t6 = (s,i) -> System.out.println("使用lambda表达式,带两个参数,不可以省略圆括号,参数为:"+s+" "+ i);
t6.test("字符串参数3",50);
}
}
@FunctionalInterface
interface TestLanmdaInterface1 {
//不带参数的抽象方法
void test();
}
@FunctionalInterface
interface TestLanmdaInterface2 {
//带参数的抽象方法
void test(String str);
}
@FunctionalInterface
interface TestLanmdaInterface3 {
//带多个参数的抽象方法
void test(String str,int num);
}
內建函数式接口
1.功能型函数式接口
public interface Function<T,R>{
public R apply(T t);
}
例如:
Function<Integer,String> fun = String::valueOf;
// 或者 IntFunction<String> fun = String::valueOf;
System.out.println(fun(1000));
2.供给型函数式接口
public interface Suppiler<T>{
public T get();
}
例如:
Supplier<String> sup = "hello"::toUpCase;
System.out.println(sup.get());
3.断言型函数式接口
public interface Predicate<T>{
public boolean test(T t);
}
例如:
Predicate<String> pre = "##hello"::startWith;
System.out.println(pre.test("##"));
4.消费型函数式接口
例如:public interface Consumer<T>{ public void accept(T t); }
Consumer<String> cons = System.out::println; cons.accept("Hello World!");