lambda表达式是java8以后才出现的新特性
- 简化代码,以创建一个线程为列,匿名函数写法通过匿名内部类
new Thread((new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 30; i++) Ticket.sale();
{
Ticket.sale();
}
}
}),"D").start();
简化后:
new Thread(()->{for(int i = 1 ; i <= 30 ; i++) Ticket.sale();},"C").start();
lambda表示式使函数具有函数式编程的能力
- 但是它的对象必须依赖函数式接口
lambda表达式简介
lambda表达式可以看成是一种匿名函数,使用场景和匿名类场景一致,都在某个方法只使用一次的时候
lambda表达式的语法结构
- 无参
()->body;
- 一个参数
(param)->body;/(param)->{body;}
- 多个参数
(param1,param2…)->{body}
- 不同类型的多个参数
(type param1,type param2…)->{body;}
列:常见的
()-> "hello"
(System,out::println);/(String s)->System.out.print()
x->2*x
(x,y)->x-y
(int x ,int y)->x+y
通过上面可以总结出lambda表达式的结构
- lambda表达式可以有0~n个函数
- 参数类型可以显示声明,也可以让编译器通过上下文自动判断,列(int x),(x)等价
- 多个参数用小括号括起来,逗号分隔
- lambda表达式可以包含0到多条语句,如果有返回值也要把返回语句写上,如果有多条语句要放在代码块中
函数式接口
@Functional interface 是java8特殊的一种函数式接口,这类接口只定义了唯一的抽象方法,列上面java。lang。Runnable就是一种函数式接口,在其内部只定义了一个void run()的抽象方法
public interface Test {
@FunctionalInterface
public abstract void run();
}
这里的注解是要求该接口要符合函数式规范除了隐含object公共对象以外只可有一个抽象方法,不包括静态方法
方法引用
- 格式:类名::方法名
NoparamInterface paraminterface2 = ()-> new HashMap<>();
NoParamInterface paraminterface2 = HashMap::new;
- 含一个参数的
OneParamInterface paraminterface = (String s)-> System.out.println(s);
OneParamInterface paraminterface = System.out.:println(s)
- 两个参数的情况
Compare c = (Compare a,compare b)->a.getAge().equals(b.getAge());
Compare c = (a,b)-a.getAge().equals(b.getAge());
- 使用函数式接口java.util.function.Function实现一个Stirng转Integer的功能
Function<Stirng s,Integer t> function = Integer::parseInt;
Integer num = function.apply(“1”);
- 线程表示实列
new Thread(new Runnable(){
public void run(){
System…
}
}),start();new Thread( ()->{System.out.println(“sd”)}).start;//这里一行可以没有大括号多行就要有大括号
- 列表遍历示列
传统遍历一个list都采用for循环但是java8之后foreach可配合lambda表达式书写
list < String >list = Arrays.asList(“hah”,“hahis”,“shdisd”);
//传统for
for(String a:: list){
System.out.println(a);
}
//改进后
list.foreach(s->Sytem.our.println(s));
list.foreach(System.out::println);
- 函数式接口示列,java下还有其他类来支持函数式编程
@Test
public void testPredicate(){
list < String >list = Arrays.asList(“hah”,“hahis”,“shdisd”);
filter(list,(str)->(“hdiidh”).equals(str));
filter(list,((String ster).length == 5 ));
}
public static void filter(List list ,Predicted condition ){
for(String s : list){
if(condition.test©{
System.out.println©
}
}
}