箭头函数 lambda表达式-(java8新特性)

  • Post author:
  • Post category:java




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) {


    }
}



五、系统内置的函数式接口: java.util.function下;



版权声明:本文为qq_49074573原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。