首页 > 编程语言 >实例说明如何使用Java 8的Function接口使得代码更加简洁以及降低重复性

实例说明如何使用Java 8的Function接口使得代码更加简洁以及降低重复性

时间:2024-07-23 13:59:07浏览次数:13  
标签:Function Java String public amount 重复性 order customerName

什么是Function接口?

Function接口是Java 8中引入的一个功能性接口,位于java.util.function包下。它代表了一个接受一个参数并产生结果的函数。这个接口只有一个抽象方法apply(T t),用于对传入的参数应用某种操作并返回一个结果。

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}

这里,T是函数的输入类型,R是函数的返回类型。

Function接口的简单应用

假设有一个Person类,我们希望将Person对象转换为String表示形式。

import java.util.function.Function;

class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class FunctionExample {
    public static void main(String[] args) {
        Function<Person, String> personToString = person -> person.getName() + " (" + person.getAge() + ")";

        Person person = new Person("Alice", 30);
        String result = personToString.apply(person);
        System.out.println(result);  // 输出: Alice (30)
    }
}

如何使用Function接口的特性来优化代码?

先假设一个场景:
我们正在开发一个电子商务平台,需要处理订单数据。订单数据包含订单号、客户名称和订单金额。我们需要将订单数据转换为不同的格式,例如:

  1. 将订单数据转换为CSV格式。
  2. 将订单数据转换为JSON格式。

传统实现:

在没有使用Function接口的情况下,我们可能会为每种格式编写单独的方法:

class Order {
    private String orderId;
    private String customerName;
    private double amount;

    public Order(String orderId, String customerName, double amount) {
        this.orderId = orderId;
        this.customerName = customerName;
        this.amount = amount;
    }

    public String getOrderId() {
        return orderId;
    }

    public String getCustomerName() {
        return customerName;
    }

    public double getAmount() {
        return amount;
    }
}

public class OrderProcessor {
    public String toCSV(Order order) {
        return order.getOrderId() + "," + order.getCustomerName() + "," + order.getAmount();
    }

    public String toJSON(Order order) {
        return "{\"orderId\":\"" + order.getOrderId() + "\",\"customerName\":\"" + order.getCustomerName() + "\",\"amount\":" + order.getAmount() + "}";
    }

    public static void main(String[] args) {
        Order order = new Order("12345", "Alice", 100.0);
        OrderProcessor processor = new OrderProcessor();

        String csv = processor.toCSV(order);
        String json = processor.toJSON(order);

        System.out.println(csv);  // 输出: 12345,Alice,100.0
        System.out.println(json); // 输出: {"orderId":"12345","customerName":"Alice","amount":100.0}
    }
}

使用Function接口的实现

通过使用Function接口,我们可以将数据转换逻辑封装起来,从而使代码更加简洁并降低重复性:

import java.util.function.Function;

class Order {
    private String orderId;
    private String customerName;
    private double amount;

    public Order(String orderId, String customerName, double amount) {
        this.orderId = orderId;
        this.customerName = customerName;
        this.amount = amount;
    }

    public String getOrderId() {
        return orderId;
    }

    public String getCustomerName() {
        return customerName;
    }

    public double getAmount() {
        return amount;
    }
}

public class OrderProcessor {
    public String convertOrder(Order order, Function<Order, String> converter) {
        return converter.apply(order);
    }

    public static void main(String[] args) {
        Order order = new Order("12345", "Alice", 100.0);
        OrderProcessor processor = new OrderProcessor();

        Function<Order, String> toCSV = o -> o.getOrderId() + "," + o.getCustomerName() + "," + o.getAmount();
        Function<Order, String> toJSON = o -> "{\"orderId\":\"" + o.getOrderId() + "\",\"customerName\":\"" + o.getCustomerName() + "\",\"amount\":" + o.getAmount() + "}";

        String csv = processor.convertOrder(order, toCSV);
        String json = processor.convertOrder(order, toJSON);

        System.out.println(csv);  // 输出: 12345,Alice,100.0
        System.out.println(json); // 输出: {"orderId":"12345","customerName":"Alice","amount":100.0}
    }
}

使用Function接口的实现方式在以下几个方面具有优势:

  1. 代码重用性

    • 传统实现方式中,每种格式的转换都需要编写一个新的方法(例如toCSVtoJSON)。如果需要添加新的格式(例如XML),则需要再编写一个新的方法。
    • 使用Function接口的实现方式中,转换逻辑被封装在Function实例中。要添加新的格式,只需创建一个新的Function实例,而不需要修改现有的代码结构。
  2. 灵活性和扩展性

    • 传统实现方式中,每个转换方法都是固定的,难以在运行时动态改变转换逻辑。
    • 使用Function接口的实现方式中,转换逻辑可以在运行时动态传入,使得代码更加灵活。例如,可以通过配置文件或用户输入来决定使用哪种转换逻辑。
  3. 单一职责原则

    • 传统实现方式中,OrderProcessor类负责多种格式的转换,违反了单一职责原则。
    • 使用Function接口的实现方式中,OrderProcessor类只负责调用转换逻辑,具体的转换逻辑由传入的Function实例负责,符合单一职责原则。
  4. 代码简洁性

    • 传统实现方式中,每种格式的转换方法都需要重复类似的代码结构。
    • 使用Function接口的实现方式中,转换逻辑被封装在Function实例中,convertOrder方法只需编写一次,减少了代码重复。

标签:Function,Java,String,public,amount,重复性,order,customerName
From: https://blog.csdn.net/qq_39354140/article/details/140633555

相关文章

  • JAVA面试题:HashMap和HashTable的区别
    一、先说结论        HashMap和HashTable都是Map接口的实现类。HashMap采用数组、链表和红黑树的数据结构,非线性安全且无序,查找效率高,初始化默认容量为2^4,每次扩容为原来的2倍;而HashTable采用数组和链表的数据结构,线性安全,键值均不允许为null,默认初始大小......
  • 【Java常用设计模式】通俗易懂的玩转单例、建造者、工厂、策略模式(保姆篇)
    文章目录单例模式建造者模式工厂模式策略模式本篇小结更多相关内容可查看在一个狂风骤雨的下午,有人突然问了我一句,单例模式是什么,我愣了,相信看完这篇就不会愣了,本文以通俗易懂的方式写的,可能有不严谨的地方......
  • 计算机课程设计:JavaWeb期刊管理系统
    计算机课程设计:JavaWeb期刊管理系统项目说明 使用JavaWeb开发的数据库显示界面的课程设计,支持数据分页查询以及期刊的模糊搜索,首页采用动态二维码生成进行校验,支持上传图片,用户密码采用md5加密,支持期刊的分页显示。使用方法:这里说明一下:大致的使用方法1、getclone......
  • java学习day01
    一.java安装1.1安装java1.81.2java内创建文件夹jdk和jre分别安装java的jdk和jre1.3环境变量JAVA_HOMEE:\work\java\jdk(自己电脑的文件位置)CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;Path内增加%JAVA_HOME%\bin(上移到最上方)二.java2.1......
  • java学习day02
    一.数据类型1.1本质数据存储形式,存储空间大小1.2存储整数存储:1.3分类基本数据类型数值型整型byte字节8bit-128~127short短整型16bit-32768~32767int整型32bit-2,147,483,648~2,147,483,647long长整型64bit浮点型float单浮点32bitdouble双浮......
  • 三种语言实现快速选择(C++/Python/Java)
    题目给定一个长度为......
  • 【前端】JavaScript入门及实战91-95
    文章目录91DOM92事件93文档的加载94DOM查询(1)95图片切换的练习91DOM<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><style></style></head><body> <buttonid="btn&quo......
  • 【前端】JavaScript入门及实战86-90
    文章目录86正则表达式87字符串和正则相关的方法88正则表达式语法(1)89正则表达式语法(2)90邮件的正则86正则表达式<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><scripttype="text/javascript"> /* 使用字面量来创建正......
  • 【前端】JavaScript入门及实战96-100
    文章目录96DOM查询(2)97DOM查询(3)98全选练习(1)99全选练习(2)100全选练习(3)96DOM查询(2)<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"> <scripttype="text/javascript"> window.onload=......
  • IDEA解决java注释顶格、xml注释右对齐+无空格问题
    先配置java中注释格式: 然后是配置xml中的注释格式:还是CodeStyle,从java往下滑动到xml......