首页 > 其他分享 >常用函数式接口

常用函数式接口

时间:2024-08-16 16:29:28浏览次数:8  
标签:Function 常用 java 函数 List 接口 util import name

生产型接口Supplier

简述

该函数接口是Java8中的java.util.function 包中的。包含一个get()

作用

  • 延迟计算:
    在需要时才生成值,提高效率。

  • 简化代码:
    封装生成逻辑,避免重复代码。

  • 灵活性:
    可以与其他函数式接口结合使用,增强可组合性。

  • 无输入参数:
    专注于提供结果,适用于无状态的生成逻辑。

代码案例

import java.util.List;
import java.util.ArrayList;
import java.util.Random;
import java.util.function.Supplier;

class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + "}";
    }
}

public class SupplierFeaturesExample {

    private static final String[] NAMES = {"Alice", "Bob", "Charlie", "Diana", "Eve"};
    private static final Random RANDOM = new Random();

    public static void main(String[] args) {
        // Supplier 用于生成随机用户
        Supplier<User> userSupplier = () -> {
            String name = NAMES[RANDOM.nextInt(NAMES.length)];
            int age = RANDOM.nextInt(50) + 18; // 生成 18 到 67 之间的随机年龄
            return new User(name, age);
        };

        // 延迟计算:用户信息在需要时才生成
        List<User> userList = new ArrayList<>();
        System.out.println("Generating random users...");

        for (int i = 0; i < 5; i++) {
            // 每次调用 userSupplier.get() 都会生成一个新的随机用户
            User user = userSupplier.get();
            userList.add(user);
            System.out.println("Generated user: " + user);
        }

        // 使用 Supplier 生成用户的另一种方式:将 Supplier 作为参数传递
        List<User> moreUsers = generateUsers(() -> {
            String name = NAMES[RANDOM.nextInt(NAMES.length)];
            int age = RANDOM.nextInt(50) + 18;
            return new User(name, age);
        }, 5);

        System.out.println("\nAdditional generated users:");
        moreUsers.forEach(System.out::println);
    }

    // 接受 Supplier 的方法,生成指定数量的用户
    private static List<User> generateUsers(Supplier<User> userSupplier, int count) {
        List<User> users = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            users.add(userSupplier.get());
        }
        return users;
    }
}

消费型接口Consumer

简述

Consumer 接口是 Java 8 引入的一个函数式接口,位于 java.util.function 包中。它代表一个接受单个输入参数并且没有返回结果的操作。Consumer 通常用于处理某种类型的对象,比如打印、修改或存储数据。

作用

  • 处理数据:
    Consumer 可以用于对单个输入数据进行处理,如打印、修改或存储。这使得数据处理逻辑能够被清晰地定义。

  • 简化代码:
    通过使用 Consumer,可以减少样板代码,使得操作更加简洁。例如,可以直接在集合的 forEach 方法中传入 Consumer 实现,从而避免显式的循环。

  • 函数式编程支持:
    Consumer 支持函数式编程风格,使得开发者能够以更灵活的方式组合和传递行为。例如,可以将多个 Consumer 组合在一起,通过 andThen 方法实现链式调用。

  • 事件处理:
    在事件驱动编程中,Consumer 可以用于处理用户输入或其他事件,提供了一种清晰的方式来定义事件处理逻辑。

  • 增强可读性:
    使用 Consumer 可以使代码逻辑更加清晰易懂,特别是在进行集合操作时,能让操作意图一目了然。

代码案例

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class ConsumerExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

        // 定义一个 Consumer,打印每个名字
        Consumer<String> printName = name -> System.out.println(name);

        // 使用 forEach 方法与 Consumer
        names.forEach(printName);

        // 使用 andThen 方法,打印名字并附加额外操作
        names.forEach(printName.andThen(name -> System.out.println("Length: " + name.length())));
    }
}

判断型接口Predicate

简述

Predicate 接口是 Java 8 引入的一个函数式接口,属于 java.util.function 包。它用于测试输入值是否满足某种条件,并返回一个布尔值。Predicate 主要用于过滤和判断操作

作用

  • 过滤集合:
    在处理集合数据时,可以使用 Predicate 进行条件过滤。

  • 条件判断:
    可以使用 Predicate 来判断对象是否符合某些条件,用于实现业务逻辑。

  • 流操作:
    在 Java Streams API 中,Predicate 被广泛用于过滤流中的元素。

代码案例

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class PredicateExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        // 定义一个 Predicate,判断名字是否以字母 'A' 开头
        Predicate<String> startsWithA = name -> name.startsWith("A");

        // 过滤集合中符合条件的名字
        List<String> filteredNames = names.stream()
                                          .filter(startsWithA)
                                          .collect(Collectors.toList());

        System.out.println(filteredNames); // 输出: [Alice]

        // 使用 and 方法,判断名字是否以字母 'A' 开头并且长度大于 3
        Predicate<String> startsWithAAndLongerThan3 = startsWithA.and(name -> name.length() > 3);
        filteredNames = names.stream()
                             .filter(startsWithAAndLongerThan3)
                             .collect(Collectors.toList());

        System.out.println(filteredNames); // 输出: [Alice]

        // 使用 or 方法,判断名字是否以字母 'A' 开头或名字长度大于 5
        Predicate<String> startsWithAOrLongerThan5 = startsWithA.or(name -> name.length() > 5);
        filteredNames = names.stream()
                             .filter(startsWithAOrLongerThan5)
                             .collect(Collectors.toList());

        System.out.println(filteredNames); // 输出: [Alice, Charlie]
        
        // 使用 negate 方法,判断名字是否不以字母 'A' 开头
        Predicate<String> notStartsWithA = startsWithA.negate();
        filteredNames = names.stream()
                             .filter(notStartsWithA)
                             .collect(Collectors.toList());

        System.out.println(filteredNames); // 输出: [Bob, Charlie, David]
    }
}

转换型接口Function

简述

Function 接口是 Java 8 引入的一个函数式接口,属于 java.util.function 包。它代表了一个接受一个输入参数并生成一个输出结果的函数。Function 接口的主要作用是将一个输入值转换成另一个值,因此常用于数据转换和映射操作中。

作用

  • 数据转换:
    用于将数据从一种形式转换为另一种形式。

  • 集合操作:
    在处理集合数据时,可以使用 Function 来映射集合中的元素。

  • 流操作:
    在 Java Streams API 中,Function 被广泛用于将流中的元素映射到另一个形式。

代码案例

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class FunctionExample {
    public static void main(String[] args) {
        // 定义一个 Function,将字符串转换为其长度
        Function<String, Integer> stringLengthFunction = String::length;

        // 使用 Function 计算每个名字的长度
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
        List<Integer> nameLengths = names.stream()
                                         .map(stringLengthFunction)
                                         .collect(Collectors.toList());

        System.out.println(nameLengths); // 输出: [5, 3, 7, 5]

        // 定义一个 Function,将整数转换为其平方
        Function<Integer, Integer> squareFunction = x -> x * x;

        // 组合两个 Function:首先计算字符串的长度,然后计算长度的平方
        Function<String, Integer> lengthSquaredFunction = stringLengthFunction.andThen(squareFunction);
        List<Integer> lengthSquares = names.stream()
                                           .map(lengthSquaredFunction)
                                           .collect(Collectors.toList());

        System.out.println(lengthSquares); // 输出: [25, 9, 49, 25]

        // 组合两个 Function:首先计算字符串的长度,然后计算长度加 1
        Function<String, Integer> lengthPlusOneFunction = stringLengthFunction.compose(x -> x + "X");
        List<Integer> lengthPlusOne = names.stream()
                                           .map(lengthPlusOneFunction)
                                           .collect(Collectors.toList());

        System.out.println(lengthPlusOne); // 输出: [6, 4, 8, 6]
    }
}

标签:Function,常用,java,函数,List,接口,util,import,name
From: https://www.cnblogs.com/dragon-925/p/18363116

相关文章

  • JS中构造函数继承问题注意事项总结
    在JavaScript中,继承是通过原型链来实现的。当你想要创建一个子类(比如Student)继承一个父类(比如Person)时,通常会使用Object.create来创建Student的原型对象。这背后有一些重要的原因:1.共享与独立性当你执行Student.prototype=Person.prototype时,Student的原型......
  • QT设置回调函数给python调用——参数法
    这种方法将回调函数作为python函数参数对象的方法来使用。Qt已经添加了Python库,并且能够正常调用Python的API,可以成功调用Python的代码块,这部分可以参考我另外一篇博客:1.QT相关函数定义1.1创建回调函数例如下面两个函数//实际的回调函数voidprintValue(intvalue){......
  • QT设置回调函数给python调用——内置模块法
    1.QT相关函数定义和 QT设置回调函数给python调用——参数法中的定义相同如下://实际的回调函数voidprintValue(intvalue){qDebug()<<"printValuevalue:"<<value;}intgetValue(intvalue){qDebug()<<"getValuevalue:"<<value;......
  • API 接口性能优化管理
    前言国内项目普遍出现工期紧、工作量大、多人协作开发编码习惯不同,能力也参差不齐等多种因素,导致接口在上线后性能不满足预期。本文从接口性能需求分析、接口性能准出标准、接口性能常见问题以及性能优化策略等多个方面,系统地完成接口性能优化的工作。同时在项目交付过程中,......
  • 产品经理必备知识——API接口
    前言在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代,我通过一部手机就可以实现衣食住行的方方面面,比如:在家购物、远程控制家电、自动驾驶......
  • git command 工作中常用命令备忘录
    模拟目前工作流程在gitlabfork需要开发的项目到自己仓库分配一个工作任务(feature、improvment、bug)本地从个人仓库克隆项目gitclonehttp://mylocal/group/project本地添加对于远端项目gitremoteaddupstreamhttp://dev.xxx.io/group/project基于远端仓库切出本......
  • 接口测试的常用协议
    接口测试的常用协议Http协议(超文本传输协议):HTTP是用于在网络上传输数据的常用协议。绝大多数的API都是基于HTTP协议的,使用HTTP方法(如GET、POST、PUT、DELETE等)进行通信。HTTPS(HypertextTransferProtocolSecure):HTTPS是HTTP的安全版本,通过使用SSL(SecureSocketsLayer......
  • JAVA面向对象|(一)Java接口 Interface
    目录一、概述(一)概念(二)特点(三)接口VS类二、使用 (一)类实现接口(二)接口间的多继承 演示(三)标记接口 1.标记接口 定义2.标记接口 作用3.标记接口 应用参考文章:Java接口_w3cschool一、概述(一)概念        Java接口是一种抽象类型,是一系列方法的声明......
  • Latex 常用符号
    文章目录一、希腊字母二、数学2.1常见数学符号2.2关系运算符2.2.1基本关系运算符2.2.2偏序关系运算符2.3集合2.4矩阵和行列式三、箭头3.1箭头符号3.2箭头上带其他符号一、希腊字母大写Latex公式小写Latex公式备注大写Latex公式小写Latex公式备注......
  • C++图像识别、图像识别接口、ocr api
    如果您在找工作并且在找内容审核编辑的工作,那么不难发现,快手在全国多个招聘网站发布了关于“内容审核编辑”岗位的招聘信息,据悉,此次的“内容审核编辑”岗位招聘的规模达3000人。因为快手上面“低龄妈妈”内容的炒作,所以被要求整改,才有后续的大规模招聘内容审核编辑人员的现象......