lambda表达式
一、 lambda表达式的使用和简写
package com.me.modules.lambda;
/**
箭头函数 lambda表达式;(java8新特性)
本质:匿名函数;
*/
public class Demolambda01 {
public static void main(String[] args) {
//1.匿名内部类 实现接口;
// call call = new call(){
// @Override
// public int add(int a, int b) {
// return a+b;
// }
// };
/**
* 2.lambad表达式;
* 只适合接口中定义一个方法(!!!);
* call call=()->{};
* ()里面是参数, ->是lambad运算符, {}里面是方法体;
*/
// call call=(int a,int b)->{
// return a+b+1;
// };
/**
* 3.lambad表达式--精简语法;
*
* 1.参数类型可以省略 (int a,int b) => (a,b)
* 2.假如只有一个语句 {}可以省略 无返回值可以省略{},需要return不可以省略; call call=(a,b)-> System.out.println(a+b);
* 3.如果唯一的一条语句是return语句,省略{}同时也要省略return; call call=(a,b)->a+b+1;
*/
// call call=(a,b)->{return a+b+1;};
/**
* 4.lambad表达式-非静态方法引用
*/
// Demolambda01 demolambda01 = new Demolambda01();
// call call=demolambda01::testA; //引用定义的方法;
// System.out.println(call.add(1,2));
/**
* 5.lambad表达式-静态方法引用
*/
call call=Demolambda01::testB;
System.out.println(call.add(1,2));
}
private int testA(int a,int b){
System.out.println("--执行testa-->"+a+"--b-->"+b);
return a+b;
}
private static int testB(int a, int b){
System.out.println("--执行testb-->"+a+"--b-->"+b);
return a+b;
}
/**
* 定义接口
*/
interface call{
//定义接口中的方法;
int add(int a,int b);
}
}
二、labbda表达式,构造方法引用;
实体类
package com.me.modules.lambda;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
Demolambda02
*/
@Data
@ToString
public class Dog {
private int age;
private String name;
public Dog() {
System.out.println("无参构造方法");
}
public Dog(int age, String name) {
System.out.println("有参构造方法");
this.age = age;
this.name = name;
}
}
引用
package com.me.modules.lambda;
/**
lambad表达式 - 构造方法引用
*/
public class Demolambda02 {
interface DogService{
Dog getDog(); //无参 构造方法
}
interface DogService2{
Dog getDog(int age,String name); //有参构造方法;
}
public static void main(String[] args) {
/**
* 6.lambad表达式 - 构造方法引用
*/
// DogService dogService=()->new Dog();
// System.out.println(dogService.getDog());//无参
//
// DogService2 dogService2=(age,name)->new Dog(age,name);
// System.out.println(dogService2.getDog(15,"小狗"));//有参
// DogService dogService=Dog::new;
// System.out.println(dogService.getDog());//无参
//
// DogService2 dogService2=Dog::new;
// System.out.println(dogService2.getDog(17,"小hua"));//有参
}
}
三、labbda表达式实例,list的排序和遍历
package com.me.modules.lambda;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
/**
实例
*/
public class Demolambda03 {
public static void main(String[] args) {
List<Dog> list = new ArrayList<>();
list.add(new Dog(1,"aa"));
list.add(new Dog(3,"bb"));
list.add(new Dog(4,"cc"));
list.add(new Dog(2,"dd"));
list.add(new Dog(5,"ee"));
System.out.println("list未排序的数据---->"+list.toString());//[Dog(age=1, name=aa), Dog(age=3, name=bb), Dog(age=4, name=cc), Dog(age=2, name=dd), Dog(age=5, name=ee)]
System.out.println("lambda表达式集合排序-------->");
list.sort((a,b)->{return a.getAge()-b.getAge();}); //age 由小到大;
System.out.println(list.toString()); //[Dog(age=1, name=aa), Dog(age=2, name=dd), Dog(age=3, name=bb), Dog(age=4, name=cc), Dog(age=5, name=ee)]
System.out.println("lambda表达式遍历集合-------->");
// list.forEach(new Consumer<Dog>() {
// @Override
// public void accept(Dog dog) {
// System.out.println(dog);
// }
// });
list.forEach((a)-> System.out.println("每一个dog对象数据"+a));
}
}
四、FunctionalInterface注解
package com.me.modules.lambda;
/**
FunctionalInterface注解
*/
public class Demolambda04 {
/**
* 添加 FunctionalInterface注解后----使用lambda表达式 得保证只能有一个抽象方法;
* 1.接口有且仅有一个抽象方法(!!!)
* 2.允许定义静态方法
* 3允许定义默认方法;
* 4.运行java.lang.object 中的pubLic方法;
* 5.注解不是必须的,加注解是能够让编辑器更好的进行检测,如果编写的不是函数式接口,那么编译器会报错;
*/
@FunctionalInterface
interface test{ //接口中没有public 默认都是public abstract修饰;
//抽象方法;
public void sub();
//java.lang.object中的public方法;
public boolean equals(Object var);
//默认方法;
public default void defaultMethod(){};
//静态方法
public static void staticMethod(){};
}
public static void main(String[] args) {
}
}