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;
}
相关文章
|
1天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
13 6
|
1天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
11 4
|
3天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
11 5
|
1天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
6 2
|
3天前
|
存储 Java 数据处理
在Java集合框架中,Set接口以其独特的“不重复”特性脱颖而出
【10月更文挑战第14天】在Java集合框架中,Set接口以其独特的“不重复”特性脱颖而出。本文通过两个案例展示了Set的实用性和高效性:快速去重和高效查找。通过将列表转换为HashSet,可以轻松实现去重;而Set的contains方法则提供了快速的元素查找功能。这些特性使Set成为处理大量数据时的利器。
11 4
|
3天前
|
Java
Java Set 是一个不包含重复元素的集合接口,确保每个元素在集合中都是唯一的
【10月更文挑战第14天】Java Set 是一个不包含重复元素的集合接口,确保每个元素在集合中都是唯一的。本文介绍了 Set 的独特特性和两个常用实现类:基于哈希表的 HashSet 和基于红黑树的 TreeSet。通过示例代码展示了它们如何高效地处理唯一性约束的数据。
14 3
|
3天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。
【10月更文挑战第14天】从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。本文深入探讨Set的核心理念,并通过示例代码展示了HashSet和TreeSet的特点和应用场景。
8 2
|
Java
Java接口和抽象类
Java接口和抽象类
86 0
|
2月前
|
设计模式 Java
【惊天揭秘】Java编程绝技大曝光:接口、抽象类、静态类与非静态类的神秘面纱终被揭开!
【8月更文挑战第22天】Java支持面向对象编程,通过接口、抽象类、静态类(如枚举与工具类)及普通类实现设计原则。接口定义行为规范,允许多重继承;抽象类含未实现的抽象方法,需子类完成;静态类常为工具类,提供静态方法;普通类则实例化对象。恰当运用这些结构能提升程序质量。
37 2
|
5月前
|
设计模式 搜索推荐 Java
java接口和抽象类的区别,以及使用选择
java接口和抽象类的区别,以及使用选择
59 0