新特性--Lambda表达式(函数式编程思想)

 一:Lambda表达式介绍

               1.概念:Lambda表达式是Java8中最重要的新功能之一。使用Lambda表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代                               码看起来更简洁易懂。Lambda表达式同时还提升了对集合、框架的迭代、遍历、过滤数据的操作;

               2.特点:1)函数式编程;

                             2)参数类型自动推断;

                             3)代码量少,简洁;

              3.应用场景:任何有函数式接口的地方;

              3.代码实现:

package com.cy;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class LambdaDemo {

    public static void main(String[] args) {
     //===========功能一:替代匿名内部类=================================
        //方式一:匿名内部类的方式
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("running---");
            }
        });
        thread.start();

        //方式二:采用Lambda表达式的方式
        new Thread(()->{
            System.out.println("running++++");
        }).start();


    //==============功能二:==============================================
        //采用匿名内部类的方式
        List<String> list= Arrays.asList("java","js","scala","python");
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length()-o2.length();
            }
        });
        for (String str:list) {
            System.out.println(str);
        }

        //采用Lambda表达式的方式
        Collections.sort(list,(a,b)->a.length()-b.length());
        list.forEach(System.out::println);

    }

}

                   表达式案例:  

                                       ()->{}

                                       ()->{System.out.println(1);}

                                       ()->System.out.println(1)

                                       ()->{return 100;}

                                       ()->100

                                       ()->null

                                       (int x)->{return x+1;}

                                       (int x)->x+1

                                       (x)->x+1

                                        x->x+1 

                                  args->expr或者(object ... args)->{函数式接口抽象方法实现逻辑}

                                  1、()参数的个数,根据函数式接口里面抽象的参数个数来决定,当参数只有一个的时候,()可以省略

                                  2、当expr逻辑非常简单的时候,{}和return可以省略

package com.lambda;

import com.why.Student;

public class LambdaTest {

    public static void main(String[] args) {
        StudentDao sd1= new StudentDao() {
            @Override
            public void insert(Student student) {
                System.out.println("插入学生1");
            }
        };

        StudentDao sd2=(student) -> {
            System.out.println("student"+student);
        };

        StudentDao sd3=(Student student)-> System.out.println("student3"+student);

        sd1.insert(new Student());
        sd2.insert(new Student());
        sd3.insert(new Student());

        TeacherDao teacherDao=new TeacherDao() {
            @Override
            public int get(Teacher teacher) {
                return 1;
            }
        };

        TeacherDao teacherDao1=(teacher)->{ return 2;};
        TeacherDao teacherDao2=(Teacher teacher)->{return 3;};
        TeacherDao teacherDao3=(teacher)->4;
        TeacherDao teacherDao4=(Teacher teacher)->5;

        System.out.println(teacherDao.get(new Teacher()));
        System.out.println(teacherDao1.get(new Teacher()));
        System.out.println(teacherDao2.get(new Teacher()));
        System.out.println(teacherDao3.get(new Teacher()));
        System.out.println(teacherDao4.get(new Teacher()));

    }
}

                           

    二:函数式接口

                                    概念:只有一个抽象方法(Object类里的方法除外)的接口是函数式接口;

                                    代码案例:

package com.cy;

/**
 * 函数式接口
 */
@FunctionalInterface//函数式接口标识注解
public interface InterfaceTest {

    public void add();

}

          三:方法的引用

                             1.概念:方法的引用是用来直接访问类或实例的已经存在的方法或者构造方法,方法的引用提供了一种引用而不执行的方式,如                                                 果抽象的方法实现恰好可以使用调用另外一个方法来执行,就有可能使用方法来执行;

                              2.分类:

                                                    

                               3.代码实现:

package com.function.refer;

import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class Test02 {

    public static void main(String[] args) {
        //静态方法引用
        staticMethod();
        //实例方法引用
        newMethod();
        //对象方法引用
        objectMethod();
        //构造方法引用
        constructorMethod();
    }

    /**
     * 静态方法引用
     */
    public static void staticMethod(){
        //方式一:直接调用
        System.out.println(put());
        //方式二:使用Lambda表达式调用;
        Supplier<String> stringSupplier=()->Test02.put();
        System.out.println(stringSupplier.get());

        //方式三:使用方法引用的方式调用
        Supplier<String> str=Test02::put;
        System.out.println(str.get());

        Supplier<String> str2=Fun::hehe;
        System.out.println(str2.get());

        Consumer<Integer> c2=Test02::countSize;
        Consumer<Integer> c3=(size)->Test02.countSize(size);
        c2.accept(123);
    }

    public static String put(){
        System.out.println("put.....");
        return "put";
    }


    public static void countSize(int size){
        System.out.println(size);
    }

    /**
     * 实例方法引用
     */
    public static void newMethod(){
        //方式一:直接调用
        System.out.println(new Test02().insert());
        //方式二:使用Lambda表达式的方式引用
        Supplier<String> stringSupplier=()->new Test02().insert();
        System.out.println(stringSupplier.get());
        //方式三:使用方法的引用调用
        Supplier<String> stringSupplier1=new Test02()::insert;
        System.out.println(stringSupplier1.get());

        //创建唯一的Test02对象
        Test02 test02 = new Test02();

        Consumer<Integer> c1=(size)->new Test02().getSize(size);
        Consumer<Integer> c2=new Test02()::getSize;
        Consumer<Integer> c3=test02::getSize;
        c1.accept(123);
        c2.accept(123);
        c3.accept(123);
    }

    public String insert(){
        return "insert--";
    }

    public void getSize(int size){
        System.out.println("size:"+size);
    }

    /**
     * 对象方法引用
     */
    public static void objectMethod(){
        //方式一:使用Lambda表达式调用
        Consumer<Fun> f1=(Fun f)->new Fun().foo();
        f1.accept(new Fun());

        //方式二:使用方法引用调用
        Consumer<Fun> f2=Fun::foo;
        f2.accept(new Fun());

        BiFunction<Fun,String,Integer> fun=(f,str)->new Fun().fun(str);
        System.out.println(fun.apply(new Fun(),"abc"));

        BiFunction<Fun,String,Integer> function=Fun::fun;
        System.out.println(function.apply(new Fun(),"abc"));
    }


    /**
     * 构造方法调用
     */
    public static void constructorMethod(){

        Supplier<Person> s1=()->new Person();
        s1.get();

        Supplier<Person> s2=Person::new;
        s2.get();

        Consumer<Integer> c1=(age)->new Person(age);
        c1.accept(123);

        Consumer<String> c2=(name)->new Person(name);
        c2.accept("wzh");
     }

}

class Fun{
    public static String hehe(){
        return "hehe";
    }

    public Integer fun(String s){
        return s.length();
    }

    public void foo(){
        System.out.println("foo---");
    }
}

class Person{
    public Person() {
        System.out.println("无参构造方法执行了");
    }

    public Person(int age){
        System.out.println(age+" 的构造法");
    }

    public Person(String name){
        System.out.println(name+"的构造方法");

    }
}

                                            

 

         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值