Java8之lambda 表达式

一、什么是函数式编程

    在数学中,函数就是有输入量、输出量的一套设计方案,也就是拿什么做什么事,那相对而言,面向对象过分强调必须通过对象的形式来做事情,而函数式编程就是尽量忽略面向对象的复杂语法---而是强调做什么,而不是以什么形式去做,总结一句话,函数式编程就是在完成一个编程任务时,通过使用不可变的值或函数,对他们进行处理,然后得到另一个值的过程。

二、什么是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等

猜你喜欢

转载自blog.csdn.net/qq_40667143/article/details/85724917