一、什么是函数式编程
在数学中,函数就是有输入量、输出量的一套设计方案,也就是拿什么做什么事,那相对而言,面向对象过分强调必须通过对象的形式来做事情,而函数式编程就是尽量忽略面向对象的复杂语法---而是强调做什么,而不是以什么形式去做,总结一句话,函数式编程就是在完成一个编程任务时,通过使用不可变的值或函数,对他们进行处理,然后得到另一个值的过程。
二、什么是lambda表达式
Lambda表达式可以理解为一种匿名函数:它没有名称,但有参数列表、函数主体、返回 类型,可能还有一个可以抛出的异常的列表。
三、lambda表达式使用前提
1、 只有在接受函数式接口的地方才可以使用Lambda表达式、而函数式接口就是仅仅声明了一个抽象方法的接口
四、lambda表达式实例
4.1、使用Lambda简化Runnable代码
/**
* 在需要一个线程去执行某个任务时,
* 我们通常会使用Rubbable接口去定义任务内容,
* 然后使用Thread去启动线程
* 1、传统方式:使用匿名类
*/
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程启动!!!");
}
}).start();
/**
* 2、实现Lambda表达式 一行搞定!!!
*/
new Thread(()->System.out.println("线程启动!!!")).start();
4.2、使用Lambda简化遍历集合
List<String> lt= Arrays.asList("hello","word","lambda");
//传统方式 遍历
for (String s : lt) {
System.out.println(s);
}
//使用lambda方式遍历
lt.forEach(item->System.out.println(item));
//如果觉得还不够简化,那还能更简化,只有你敢想!!!
lt.forEach(System.out::println);
//System.out::println ::==>方法引用 可以对我们的lambda表达式代码进行简化。
/**
* 使用方法前提:
* 1、对象是已经存在的:比如 System.out
* 2、方法是已经存在的 :比如 println
*/
4.3 使用Lambda表达式实现打印输出内容
/**
* 定义打印输出的函数式接口
*/
@FunctionalInterface
public interface PrintOut {
void print();
}
/**
* Lambda表达式的无参无返回值的练习
*/
public class LambdaVoid {
public static void main(String[] args) {
//使用lambda表达式进行输出
printString(()->System.out.println("你好啊!"));
}
/**
* 定义printString方法 参数传递PrintOut接口 内部去调用PrintOut接口的print方法
* @param out
*/
private static void printString(PrintOut out){
out.print();
}
}
4.4、使用Lambda表达式对年龄进行升序排序
//定义数组
Person[] person={
new Person("zhangsan",18),
new Person("lisi",15),
new Person("wangwu",19)
};
//按年龄升序输出 使用匿名类的方式
Arrays.sort( person, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
//遍历数组
for (Person person1 : person) {
System.out.println(person1.getName()+"==>"+person1.getAge());
}
System.out.println("============================");
//使用Lambda表达式方式 一行就搞定
Arrays.sort(person,(o1,o2)->o1.getAge()-o2.getAge());
for (Person person2 : person) {
System.out.println(person2.getName()+"==>"+person2.getAge());
}
5、总结
1、 Lambda表达式可以理解为一种匿名函数:它没有名称,但有参数列表、函数主体、返回 类型,可能还有一个可以抛出的异常的列表
2、 Lambda表达式让你可以简洁地传递代码.
3、函数式接口就是仅仅声明了一个抽象方法的接口
4、只有在接受函数式接口的地方才可以使用Lambda表达式
5、 Lambda表达式允许你直接内联,为函数式接口的抽象方法提供实现,并且将整个表达式 作为函数式接口的一个实例。
6、为了更好去使用 Lambda表达式 Java 8自带一些常用的函数式接口,放在java.util.function包里,如Predicate 、Function、Supplier、Consumer和BinaryOperator,
7、为了避免装箱操作,对Predicate和Function等通用函数式接口的原始类型 特化:IntPredicate、IntToLongFunction等