ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java8-lambda表达式

2022-01-26 19:31:29  阅读:137  来源: 互联网

标签:oper int void MathOper public static Java8 表达式 lambda


借助一段代码进行lambda表达式的分析:

public class Main {
    public static void main(String[] args) {
        MathOper addOper=new MathOper() {
            @Override
            public int oper(int a, int b) {
                return a+b;
            }
        };
        MathOper subOper=new MathOper() {
            @Override
            public int oper(int a, int b) {
                return a-b;
            }
        };
        oper(3,4,addOper);
        oper(3,4,subOper);
    }
    static void oper(int a,int b,MathOper mathOper){
        System.out.println(mathOper.oper(a,b));
    }
}
interface MathOper{
    int oper(int a,int b);
}
View Code

上面的代码代码中,MathOper是一个很简单的接口,里面只包含了一个抽象方法,为了方便起见,我没有创建它的实现类,而是在使用的时候,直接利用MathOper接口创建响应的匿名类对象,并在匿名类中实现oper方法,然后在static void oper方法中调用相应的匿名类对象去进行相应的计算,上面的操作方法虽然可以实现相应的功能,但是代码结构不是那么紧凑,是不是还可以更简单一点,有的:

public class Main {
    public static void main(String[] args) {
        MathOper addOper = (a, b) -> a + b;
        MathOper subOper = (a, b) -> a - b;
        oper(3, 4, addOper);
        oper(3, 4, subOper);
    }
    static void oper(int a, int b, MathOper mathOper) {
        System.out.println(mathOper.oper(a, b));
    }
}

interface MathOper {
    int oper(int a, int b);
}
View Code

 上面的代码中,我没有创建匿名类对象,只是将抽象函数的”操作结构“负值给了addOper,subOper变量,然后再在static void oper方法使用这些变量,上面的代码结构能不能再进一步优化呢?既然static void oper方法中已经有了mathOper变量声明,我们能不能把addOper,

subOper变量也一并省了,直接传递”操作结构“呢?答案是可以的,如下:

public class Main {
    public static void main(String[] args) {
        oper(3, 4, (a, b) -> a + b);
        oper(3, 4, (a, b) -> a - b);        
    }
    static void oper(int a, int b, MathOper mathOper) {
        System.out.println(mathOper.oper(a, b));
    }
}

interface MathOper {
    int oper(int a, int b);
}
View Code

 上面的代码更加紧凑了,没有声明多余的变量,直接将函数体传递给了oper方法,由oper方法去解析执行相应的操作,上面的这种紧凑的语法表达形式就是Lambda表达式,Lambda表达式的语法结构组成有:

1、由括号(”()“)包裹起来的并且被分号(",")隔开的参数,如上面的(a, b)

2、水平右指的箭头("->")

3、代码体,可由大括号("{}")包裹起来的代码块,也就是具体的功能实现语句,如果是简单的一条执行语句,则不需要由大括号包裹,如上面的a+b,再举一个对数组对象进行排序的例子,如下:

 

public class Main {
    public static void main(String[] args) {
        Person[] pers={new Person(12,"h1"),
                new Person(23,"h2"),
                new Person(14,"h3"),
                new Person(2,"h4")};
        Arrays.sort(pers,(b1,b2)->{
            return b1.getAge()-b2.getAge();
        });
        Arrays.stream(pers).forEach(obj->System.out.print(obj+" "));
    }
}
@Data
@ToString
class Person{
    int age;
    String name;
    public Person(int age,String name){
        this.age=age;
        this.name=name;
    }
}
View Code

 

以上是lambda表达式使用总结,道阻且长,未来可期......

 

标签:oper,int,void,MathOper,public,static,Java8,表达式,lambda
来源: https://www.cnblogs.com/codeMedita/p/15845975.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有