3. 函数接口

作者: HmilyMing | 来源:发表于2019-01-26 22:58 被阅读157次

我们先来写一个类里面的接口

interface IMoneyFormat{
    String format(int i);
}

然后定义一个私有类

class MyMoney{
    private final int money;
    public MyMoney(int money){
        this.money = money;
    }

    public void printMoney(IMoneyFormat moneyFormat) {
        System.out.println("我的存款:" + moneyFormat.format(this.money));
    }
}

最后写个共有类调用它

public class MyMoneyDemo {
    public static void main(String[] args) {
        MyMoney me = new MyMoney(100000);
        me.printMoney(i -> new DecimalFormat("#,###").format(i));
    }
}

运行 main 方法,打印出下面的内容


image

之前说过, lambda 表达式不关心你实现的是哪个接口,好比它不需要知道你接口名,方法名,它只要知道输入是什么,输出是什么。所以,在上面的例子中,其实我们不要定义一个接口,只要定义一个输入是 int 类型,输出是 String 类型的函数即可。

将上面的代码改成如下的:

class MyMoney2{
    private final int money;
    public MyMoney2(int money){
        this.money = money;
    }

    public void printMoney(Function<Integer, String> moneyFormat) {
        System.out.println("我的存款:" + moneyFormat.apply(this.money));
    }
}

然后在 main 调用时改成 用 MyMoney2,运行 main 方法,也能得到同样的结果。这就能节省我们定义接口的工作了。

还可以这样玩

    public static void main(String[] args) {
        MyMoney2 me = new MyMoney2(100000);
        Function<Integer, String> moneyFormat = i -> new DecimalFormat("#,###").format(i);
//        函数接口链式操作
        me.printMoney(moneyFormat.andThen(s -> "RMB " + s));
    }
image

这样不仅可以定义更少的接口,还能更灵活的实现接口。

总的函数接口如下:

image

以上这些都是可以很灵活使用的,下面我举两个例

    public static void fuctionTest(){
//        断言函数接口
        Predicate<Integer> predicate = i -> i > 0;
        System.out.println(predicate.test(-1));
//        消费函数接口
        Consumer<String> consumer = s -> System.out.println(s);
        consumer.accept("input data");
    }

然后在 main 方法里面调用这个方法,输出如下

image

同时,你还可以使用 IntPredicate、IntConsumer 等等,这样子定义类型都可以省略了。

    public static void fuctionTest2(){
//        断言函数接口
        IntPredicate predicate = i -> i > 0;
        System.out.println(predicate.test(-1));
//        消费函数接口
        IntConsumer consumer = s -> System.out.println(s);
        consumer.accept(99);
    }
代码地址: https://github.com/hmilyos/lambda-demo.git

相关文章

  • 3. 函数接口

    我们先来写一个类里面的接口 然后定义一个私有类 最后写个共有类调用它 运行 main 方法,打印出下面的内容 之前...

  • ts接口 interface

    概念:可以用来约束一个函数,对象,以及类的结构和类型 1.对象类型的接口 2.函数类型的接口 3.混合类型的接口(...

  • 2020-03-09 7种设计原则

    单一原则 接口隔离原则 依赖倒转原则接口! 抽象类!抽象和细节1. 接口2. 构造函数3. setter 里氏替换...

  • Kotlin中使用高阶函数代替接口回调

    Kotlin中使用高阶函数代替接口回调 Java思路实现 1.创建接口,创建对应抽象方法2.声明接口成员变量3.创...

  • java基础-day23-函数式接口和Stream流

    函数式接口和Stream 1. 函数式接口 1.1 函数式接口概述 1.2 常用函数式接口 1.3 比较器函数式接...

  • 2020-07-04【函数式接口】

    函数式接口概述 函数式接口作为方法的参数 函数式接口作为方法的返回值 常见的函数式接口 Supplier接口 Co...

  • 0.Java8 简介

    1. lambda 表达式 2. 函数式接口 3. 方法引用于构造器引用 4. Stream API 5. 接口中...

  • 12.函数式接口

    主要内容 自定义函数式接口 函数式编程 常用函数式接口 第一章 函数式接口 1.1 概念 函数式接口在Java中是...

  • 【十】Java8新特性

    一、主要内容 1.Lambda表达式 2.函数式接口 3.方法引用和构造器引用 4.Stream API 5.接口...

  • 测验:函数式接口

    下面哪些接口是函数式接口? 答案:只有Adder是函数式接口。SmartAdder不是函数式接口,因为它定义了两个...

网友评论

    本文标题:3. 函数接口

    本文链接:https://www.haomeiwen.com/subject/itopjqtx.html