Lambda表达式和接口增强

Lambda表达式

Lambda是JDK1.8推出的重要新特性。很多开发语言都开始支持函数式编程,其中最具备代表性的就是haskell。
函数式编程和面向对象编程可以理解为两大开发阵营。很多人认为面向对象的概念过于完整,结构操作不明确。

我们编写一个简单的加法程序为例

  • 当我们如果不仅使用x+y方法时,比如说想扩展x+y+10方法时,我们会发现,我们需要像函数重载一样编写多个函数。
package www.bit.java;

class Add {
    public void add(int x,int y){
        System.out.println(x+y);
    }
    public void add1(int x,int y){
        System.out.println(x+y+10);
    }
}

public class MyEnum {
    public static void main(String[] args) {
        Add add = new Add();
        add.add(10,20);    // 30 
        add.add1(10,20);   // 40
    }
}
  • 面象对象设计(使用内部类)
package www.bit.java;

interface Add {
    void add(int x,int y);
}

public class MyEnum {
    public static void main(String[] args) {
        Add add = new Add() {
            @Override
            public void add(int x, int y) {
                System.out.println(x+y);
            }
        };
        add.add(10,20);
        
        Add add1 = new Add() {
            @Override
            public void add(int x, int y) {
                System.out.println(x+y+10);
            }
        };
        add1.add(10,20);
    }
}
  • 函数式编程
package www.bit.java;

interface Add {
    void add(int x,int y);
}

interface Mul{
    int mul(int x,int y);
}
interface Sub {
    int sub(int x,int y);
}

public class MyEnum {
    public static void main(String[] args) {
        // 方法体只有一行代码时: (方法参数) ->  具体方法体实现
        Add add = (x,y) -> System.out.println(x+y);
        add.add(10,20);  // 30

        // 当方法有返回值时,单行代码的Lambda表达式可以省略return语句
        Mul mul = (x,y) -> x/y;
        System.out.println(mul.mul(10,5));  // 2

        /*
            当方法体有多行代码时  
            (方法参数)-> {
                ...;
                ... 
                return 语句;
            };        
         */
        Sub sub = (x,y) -> {
            int temp = x*y;
            x += 2;
            y -= 1;
            return temp-x-y;
        };
        System.out.println(sub.sub(5,4));  // 10
    }
}


要想使用函数式编程有一个前提:接口必须只有一个抽象方法。如果存在两个以上的方法,无法使用函数式编程。
如果现在某个接口就是为了函数式编程而生的,在定义时只能存在一个方法,因此有一个新的注解@FunctionalInterface,此注解会检查该接口中是否只存在一个抽象方法,存在两个抽象方法以上编译报错。

package www.bit.java;

import javax.xml.ws.FaultAction;

@FunctionalInterface    // 是一个函数式编程接口,只允许有一个方法
interface Add {
    int add(int x,int y);    // 这是一个接口,接口中的抽象方法必须由子类覆写。
}

public class MyEnum {
    public static void main(String[] args) {
        Add add = (x,y) -> x+y;
        System.out.println(add.add(10,20));
    }
}


接口增强

  • 使用default定义的普通方法,需要通过接口对象来调用。
  • 使用static定义的静态方法,直接使用接口名调用。
interface IInterface {
    void test();
    default void fun(){
        System.out.println("1-----------");
    }
    static void method() {
        System.out.println("2-----------");
    }
}

class InterfaceImpl implements IInterface {
    public void test(){
        System.out.println("3---------------");
    }
}
public class Test {
    public static void main(String[] args) {
        IInterface in = new InterfaceImpl();
        in.test();
        in.fun();
        IInterface.method();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值