zoukankan      html  css  js  c++  java
  • Java8新特性(一)lambda表达式

    记录学习java8新特性的第一篇

    Lambda

    lambda是用来简化接口的

    使用要求,接口必须是函数式接口

    1.函数式接口

    package lambda.lambdaInterface;
    
    /**
     * @ Author     :fqg
     * @ Date       :Created in 8:43 2020/7/30
     */
    @FunctionalInterface
    public interface NoneReturnMultipleParameter {
        void test(int a, int b);
    }

    接口的实现类有且只有一个必须执行的抽象方法,使用Java自带的@FunctionalInterface注解可以判断这个接口是否是函数式接口

    lambda主要表示匿名函数,并不关心方法名,主要关心参数列表和方法体

    下面是主要定义的几个接口

    package lambda.lambdaInterface;
    
    /**
     * @ Author     :fqg
     * @ Date       :Created in 8:41 2020/7/30
     */
    @FunctionalInterface
    public interface NoneReturnNoneParameter {
        void test();
    }
    View Code
    package lambda.lambdaInterface;
    
    /**
     * @ Author     :fqg
     * @ Date       :Created in 8:42 2020/7/30
     */
    @FunctionalInterface
    public interface NoneReturnSingleParameter {
        void test(int a);
    }
    View Code
    package lambda.lambdaInterface;
    
    /**
     * @ Author     :fqg
     * @ Date       :Created in 8:45 2020/7/30
     */
    @FunctionalInterface
    public interface SingleReturnMultipleParameter {
        int test(int a, int b);
    }
    View Code
    package lambda.lambdaInterface;
    
    /**
     * @ Author     :fqg
     * @ Date       :Created in 8:42 2020/7/30
     */
    @FunctionalInterface
    public interface SingleReturnNoneParameter {
        int test();
    }
    View Code
    package lambda.lambdaInterface;
    
    /**
     * @ Author     :fqg
     * @ Date       :Created in 8:44 2020/7/30
     */
    @FunctionalInterface
    public interface SingleReturnSingleParameter {
        int test(int a);
    }
    View Code

    下面是语法及其精简过程

    package lambda;
    
    import lambda.lambdaInterface.*;
    
    /**
     * @ Author     :fqg
     * @ Date       :Created in 8:39 2020/7/30
     */
    public class BasicSyntax {
        public static void main(String[] args) {
            //1.测试无参数无返回值的函数
            NoneReturnNoneParameter lambda1 = ()->{
                System.out.println("这是一个无参数无返回值的函数方法");
            };
            lambda1.test();
            //2.测试无返回值单一参数的函数
            NoneReturnSingleParameter lambda2 = (a) ->{
                System.out.println("这是一个单一参数无返回值的函数方法 a = " + a);
            };
            lambda2.test(10);
            //3.测试无返回值多个参数的函数
            NoneReturnMultipleParameter lambda3 = (a, b)->{
                System.out.println("这是一个无返回值多个参数的函数方法 a = " + a + ", b = "+ b);
            };
            lambda3.test(10, 20);
            //4.复杂逻辑,在方法体中就会不太方便,所以使用静态方法引用
            //使用多个参数单一返回值来访问这个静态方法calculate
            SingleReturnMultipleParameter lambda4 = BasicSyntax::calculate;
            System.out.println(lambda4.test(10, 20));//10
            //非静态方法调用
            //实例对象
            SingleReturnMultipleParameter lambda = new BasicSyntax()::calculateNotStatic;
            System.out.println(lambda.test(10, 20));//10
            //语法精简
            //参数列表精简
            //单一参数可以省略小括号
            SingleReturnSingleParameter lambda5 = a ->{
                System.out.println("这是精简过后的单一参数单一返回值方法 a = " + a);
                return a;
            };
            System.out.println(lambda5.test(10));
    
            //方法体精简
            //方法体中只含有一个语句可以省略大括号,同时可以省略return
            SingleReturnMultipleParameter lambda6 = (a, b) -> a + b;//直接返回a + b
    
            //调用构造方法
            GetPersonWithNoneParameter lambda7 = Person::new;
            Person person1 = lambda7.getPerson();
            //传入单一参数来执行构造方法
            GetPersonWithSingleParameter lambda8 = Person::new;
            Person person2 = lambda8.getPerson("xiaohong");
            //传入多个参数来执行构造方法
            GetPersonWithMultipleParameter lambda9 = Person::new;
            Person person3 = lambda9.getPerson("xiaoming", 10);
    
            //当传入参数是一个类,同时整个方法体中主要就是调用类其中的一个方法
            GetStudent lambda10 = Student::getName;
            Student student = new Student();
            student.setName("xiaoming");
            System.out.println(lambda10.get(student));
    
        }
        public static int calculate(int a, int b){
            if(a < b){
                return b - a;
            }else if (a > b){
                return a - b;
            }else{
                return a + b;
            }
        }
        public  int calculateNotStatic(int a, int b){
            if(a < b){
                return b - a;
            }else if (a > b){
                return a - b;
            }else{
                return a + b;
            }
        }
        @FunctionalInterface
        public interface GetPersonWithNoneParameter{
           Person getPerson();
        }
        @FunctionalInterface
        public interface GetPersonWithSingleParameter{
            Person getPerson(String name);
        }
        @FunctionalInterface
        public interface GetPersonWithMultipleParameter{
            Person getPerson(String name, int age);
        }
    
        public interface GetStudent{
            String  get(Student student);
        }
    
        private static class Person{
            String name;
            int age;
            public Person(){
                System.out.println("无参数的构造方法以执行");
            }
            public Person(String name){
                System.out.println("单一参数的构造方法以执行 name = " + name );
            }
            public Person(String name, int age){
                System.out.println("多个参数的构造方法以执行 name = " + name + ", age = " + age );
            }
        }
    
        private static class Student{
            private String name;
            private int age;
            public void setName(String name){
                this.name = name;
            }
            public String getName(){
                return this.name;
            }
        }
    }

    run ending

  • 相关阅读:
    字符串replaceAll()方法报错:java.util.regex.PatternSyntaxException:Unclosed group near index...
    eclipse导入Tomcat8源码
    [白话解析] 深入浅出朴素贝叶斯模型原理及应用
    [白话解析] 深入浅出一致性Hash原理
    [白话解析] 深入浅出贝叶斯定理
    [白话解析] 深入浅出边缘计算
    [梁山好汉说IT] 用实例来深入理解容器概念
    [梁山好汉说IT] 梁山好汉和抢劫银行
    [梁山好汉说IT] 梁山好汉和秒杀系统
    [梁山好汉说IT] 区块链在梁山的应用
  • 原文地址:https://www.cnblogs.com/frank9571/p/13403864.html
Copyright © 2011-2022 走看看