Java8 Functional Interface写给自己的小白函数式接口说明

简介: Java8 Functional Interface写给自己的小白函数式接口说明

1 什么是函数式接口

函数式接口 (Functional Interface) 就是 有且仅有一个抽象方法,但是 可以有多个非抽象方法的接口。通常 Lambda 表达式在函数式接口上使用的

Java8 引入 @FunctionalInterface 注解声明该接口是一个函数式接口。比如常用的 Consumer 接口:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

在这里插入图片描述

2 函数式接口实例

Java8 其实已经为我们定义好了 最常用的四类内置函数式接口

函数式接口 入参类型 返回类型 作用示例
Consumer T void Stream.peek()
Supplier T Stream.generate()
Function T R Stream.map()
Predicate T boolean Stream.filter()

2.1 消费型接口 Consumer < T >

定义了 void accept(T t),只接收一个参数T,无返回值。比如:⬇️
只会将money进行打印,将 System.out.println(x) 进行消费,就没有剩余操作了
public void testConsumer() {
    testConsumerRealize(1000, x -> System.out.println(x));
}

public void testConsumerRealize(double money, Consumer<Double> con) {
    con.accept(money);
}

2.2 供给型接口 Supplier < T >

定义了 T get(),将生产的数据返回,返回值即生产的数据。比如:⬇️
将 (int) Math.random() * 100 产生的数据通过 .get()获取到
public void testSupplier() {
    List<Integer> list = getNumList(5, () -> (int) Math.random() * 100);
    list.forEach(System.out::println);
}

public List<Integer> getNumList(int maxSize, Supplier<Integer> supplier) {
    List<Integer> list = new ArrayList<>(maxSize);
    for (int i = 0; i < maxSize; i++) {
        Integer n = supplier.get();
        list.add(n);
    }
    return list;
}

2.3 函数型接口 Function < T, R >

定义了 R apply(T t), 入参接受范性 T 对象, 然后返回范性 R 对象,这种一般称之为 功能型接口。比如:⬇️
这段程序就是将字符串 "  百万 龙台 " 前后空格去除,返回一个新的字符串对象 
public void testFunction() {
    String resultStr = strTrim("  百万 龙台 ", str -> str.trim());
    System.out.println(resultStr);
}

public String strTrim(String str, Function<String, String> fun) {
    return fun.apply(str);
}

2.4 断言型接口 Predicate < T >

定义了 boolean test(T t),满足条件则为 True,反之则为 False。比如:⬇️
 此段代码程序如果initList中的元素符合 .length() > 3,则加入到返回集合中
public void testPredicate() {
    List<String> initList = Arrays.asList("马百万", "马龙台", "马学习", "马天天学习");
    List<String> resultList = filterStr(initList, (s) -> s.length() > 3);
    resultList.forEach(each -> System.out.println(each));
}

public List<String> filterStr(List<String> list, Predicate<String> pre) {
    List<String> strings = new ArrayList<>();
    for (String string : list) {
        if (pre.test(string)) {
            strings.add(string);
        }
    }
    return strings;
}

3 自定义函数式接口

3.1 定义函数式接口

/**
 * 对象转换
 *
 * @author MaLongT
 * @date 2019/12/6 下午1:00
 */
@FunctionalInterface
public interface ConvertFunction<R, T> {

    R convert(T t);

}

3.2 定义测试方法

其实这个 Demo 是和 Function < T, R > 用法和语义都是一致的。如果明白了原理,那么实现不同的函数式接口都是可以的
会将字符串 “1” 转换成 数值类型的 1 进行打印输出
public void testConvert() {
    Integer resultInt = testConvertRealize("1", s -> Integer.valueOf(s));
    System.out.println(resultInt);
}

public Integer testConvertRealize(String source, ConvertFunction<Integer, String> convertFunction) {
    Integer target = convertFunction.convert(source);
    return target;
}
相关文章
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
160 57
|
2月前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
92 38
|
16天前
|
数据采集 JSON Java
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
21天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
46 6
|
2月前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
28 2
|
2月前
|
Java
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
171 64
|
2月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
129 1
|
Java
Java’Interface’接口简单练习题
Java’Interface’接口简单练习题
96 0
|
Java
java中的interface接口
接口:java接口是一些方法表征的集合,但是却不会在接口里实现具体的方法。 java接口的特点如下: 1、java接口不能被实例化 2、java接口中声明的成员自动被设置为public,所以不存在private成员 3、java接口中不能出现方法的具体实现。
874 0
|
10天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者