函数式编程思想——Lambda表达式
Lambda是JDK1.8之后的新特性,传统的编程思想是面向对象的,即想调用一个方法时,需要创建一个对象,再调用这个对象中的方法。而函数式编程只要结果正确,而不在意对象是谁,方法名是谁。面向对象的编程会产生大量的冗余代码(实现类对象,重写方法等),而且这些冗余代码是必要的。而函数式编程思想,则大大减少了冗余代码。Lambda表达式就是函数式编程思想的具体表现形式。
//比较传统编程与lambda表达式
public static void main(String[] args) {
//1.面向对象的传统编程
new Thread(new Runnable() {//新建匿名对象
@Override//重写方法
public void run() {
System.out.println(Thread.currentThread().getName()+"线程运行");
}
}).start();
//2.函数式编程思想的lambda表达式
new Thread(() ->{
System.out.println(Thread.currentThread().getName()+"线程运行");
}
).start();
}
lambda表达式使用前提:必须有接口,且接口中只有一个抽象方法,又名“函数式接口”。
lambda表达式的格式:
(参数列表)->{方法体}
lambda表达式也可以有更简单的省略写法,总的来说,可推导,就可省略:
可省略的内容:
1.(参数列表):数据类型可省略
2.(参数列表):只有一个参数时,数据类型和()可省略
3.{方法体}:如果方法体只有一行,可省略{}、return、;
注意:{}、return、;必须一起省略
eg:
1.重写方法无参无返回值时:
//interface
public interface Cook {
void makeFood();
}
//main
public static void main(String[] args) {
invokeCook(()->{
System.out.println("吃饭喽");
});
//省略格式
invokeCook(()->System.out.println("吃饭喽"));
}
public static void invokeCook(Cook cook){
cook.makeFood();
}
2.重写方法有参有返回值:
//Person类
public class Person {
private String name;
private int age;
//使用sort排序需要重写equals和hashCode方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
//省略构造器,Getter、Setter、toString
}
public static void main(String[] args) {
//新建ArrayList数组,存储Person对象
ArrayList<Person> people = new ArrayList<>();
people.add(new Person("张四",17));
people.add(new Person("张七",150));
people.add(new Person("张五",18));
people.add(new Person("张三",15));
//调用sort方法排序
Collections.sort(people, (Person o1, Person o2)-> {
return o1.getAge() - o2.getAge();
}
);
//省略格式
Collections.sort(people, ( o1, o2)->o1.getAge() - o2.getAge());
//输出
System.out.println(people);
}
3.重写方法有参无返回值时:
//interface
public interface Calculator {
void cacl(int a,int b);
}
//main
public static void main(String[] args) {
invokeCalc(120, 130,(a,b)->{
System.out.println(a+b);
});
//省略格式
invokeCalc(120, 130,(a,b)->System.out.println(a+b));
}
public static void invokeCalc(int a,int b,Calculator calc){
calc.cacl(a,b);
}