百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

七爪源码:如何在 Java 中实现元组

lipiwang 2024-11-22 17:20 5 浏览 0 评论

在java中创建自定义元组数据类型


介绍

  • 元组是一种旨在存储异构对象的数据结构。
  • 当我们想要存储或返回异构对象(例如包含姓名、年龄、薪水等的 Customer 对象)时,它很有用。
  • 在 Java 中,我们没有 SDK 提供的开箱即用的元组数据结构,但我们可以使用 Collection,如数组或 ArrayList。
  • 我们还可以创建自己的 Tuple 类来提供这些功能。
  • 除此之外,我们还有一些支持在 java 中创建元组的库。

用例

  • 假设我们要创建存储 name 、 age 的客户对象。
    name 是字符串,而 age 是整数。
  • 现在在 java 中,如果我们想存储这些异构数据,那么在 Java 中我们几乎没有选择。 让我们 - 探索。


使用列表作为元组

  • 我们通常存储列表来存储特定的数据类型,例如整数、字符串甚至自定义类型。
  • 但是我们也可以将对象数据类型存储在 List 中,尽管不推荐这样做,并且可能导致软件产生错误。这就是为什么在 java 中引入泛型以对 Collection 进行编译时检查,以便开发人员定义他们想要存储的数据类型。
        String userName = "Sam";
        Integer age =23;

        List customer = Arrays.asList(userName,age);

        System.out.println("customer name : "+customer.get(0));
        System.out.println("customer age : "+customer.get(1));
  • 正如我们所见,我们将客户创建为列表并存储异构数据类型,但不建议这样做以避免代码中的错误。


实现自定义元组类

  • 我们还可以创建我们的自定义元组实现。

一对

  • 让我们实现 2 个元素的元组。 为了我们必须使用泛型来存储任何类型的元素。
  • 尽管我们的元组在设计上是不可变的,但我们也可以创建可变元组。
import java.io.Serializable;

public class Tuple2<T,U> implements Serializable {
    private static final long serialVersionUID = -2344986941139471507L;

    private final T val1;
    private final U val2;

    public Tuple2(final T val1, final U val2) {
        this.val1 = val1;
        this.val2 = val2;
    }

    public static <T,U> Tuple2 of(final T val1, final U val2){
        return new Tuple2(val1,val2);
    }

    public T getVal1() {
        return val1;
    }

    public U getVal2() {
        return val2;
    }

    @Override
    public String toString() {
        return "Pair{" +
                "val1=" + val1 +
                ", val2=" + val2 +
                '}';
    }
}


三胞胎

  • 类似地,我们可以扩展 2 个元素的元组想法来实现 3 或 4 的元组,依此类推。
import java.io.Serializable;

public class Tuple3<T,U,V> implements Serializable {

    private static final long serialVersionUID = -5193340612637235968L;
    private final T val1;
    private final U val2;
    private final V val3;

    public Tuple3(final T val1, final U val2, final V val3) {
        this.val1 = val1;
        this.val2 = val2;
        this.val3 = val3;
    }

    public static <T,U> Tuple3 of(final T val1, final U val2, final U val3){
        return new Tuple3(val1,val2,val3);
    }

    public T getVal1() {
        return val1;
    }

    public U getVal2() {
        return val2;
    }

    public V getVal3() {
        return val3;
    }

    @Override
    public String toString() {
        return "Tuple3{" +
                "val1=" + val1 +
                ", val2=" + val2 +
                ", val3=" + val3 +
                '}';
    }
}

客户代码

  • 一旦我们的元组实现准备就绪,我们就可以使用我们的客户端代码。
  • 请注意,我们的实现是不可变的,因此我们只能使用构造函数或使用工厂方法来创建实例来初始化元组。 我们没有设置器来初始化元组。
    public static void main(String[] args) {

        // setup tuple
        Tuple2<String,Integer> pair = new Tuple2<>("Sam Lee", 23);

        // get tuple
        System.out.println(pair.getVal1());

        // setup tuple
        Tuple2<Integer, String> pair1 = Tuple2.of(10, "Done");
        System.out.println(pair1.getVal1());

        // setup tuple
        Tuple3<String,Integer,Integer> triplet = new Tuple3<>("Sam Lee", 23, 123);
        System.out.println(triplet.toString());

    }

使用库

  • 我们也可以使用库来创建 tuple 。 图书馆很少,例如
    - Apache Commons 朗
    - Java元组
  • 让我们使用 Apache Commons Lang 来实现 2 个元素的元组。
    由于它是第三方库,我们需要使用 maven 或 gradle 导入它。
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
    </dependencies>
  • 我们可以使用 apache commons 实现 immutablePair 和 mutablePair 来创建 2 个元素的元组
  • 在 mutablePair 的情况下,我们可以修改我们的元组。
        ImmutablePair<String, Integer> customer = ImmutablePair.of("Sam", 23);
        System.out.println(customer.toString());

        MutablePair<String, Integer> customer = MutablePair.of("Sam", 23);
        System.out.println(customer.toString());
        customer.setRight(30);
        System.out.println(customer.toString());


为什么 Java 没有内置元组?

  • 这样做的原因不是很清楚,但支持它的一个论点是 java 更注重可读性,因此与其使用诸如 tuple 之类的通用容器来存储元素,不如为该对象本身创建 Class 会很好。
  • 在我们的示例中,我们可以为客户创建特定的类,而不是将其存储在元组中。
  • 这将使我们的代码更具可读性,因为对象的类型将是清晰的,而不是通用元组。
  • 但是作为开发人员,我们有很多选择来解决存储异构数据类型的问题。


结论

  • 在本文中,我们讨论了在 java 中存储异构数据类型的不同方法。
  • 我们可以自定义实现 tuple ,使用第三方库,如 javatuple ,甚至我们可以创建自定义类。


关注七爪网,获取更多APP/小程序/网站源码资源!

相关推荐

ubuntu单机安装open-falcon极度详细操作

备注:以下操作均由本人实际操作并得到验证,喜欢的同学可尝试操作安装。步骤一1.1环境准备(使用系统:ubuntu18.04)1.1.1安装redisubuntu下安装(参考借鉴:https://...

Linux搭建promtail、loki、grafana轻量日志监控系统

一:简介日志监控告警系统,较为主流的是ELK(Elasticsearch、Logstash和Kibana核心套件构成),虽然优点是功能丰富,允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,...

一文搞懂,WAF阻止恶意攻击的8种方法

WAF(Web应用程序防火墙)是应用程序和互联网流量之间的第一道防线,它监视和过滤Internet流量以阻止不良流量和恶意请求,WAF是确保Web服务的可用性和完整性的重要安全解决方案。它...

14配置appvolume(ios14.6配置文件)

使用AppVolumes应用程序功能,您可以管理应用程序的整个生命周期,包括打包、更新和停用应用程序。您还可以自定义应用程序分配,以向最终用户提供应用程序的特定版本14.1安装appvolume...

目前流行的缺陷管理工具(缺陷管理方式存在的优缺点)

摘自:https://blog.csdn.net/jasonteststudy/article/details/7090127?utm_medium=distribute.pc_relevant.no...

开源数字货币交易所开发学习笔记(2)——SpringCloud

前言码云(Gitee)上开源数字货币交易所源码CoinExchange的整体架构用了SpringCloud,对于经验丰富的Java程序员来说,可能很简单,但是对于我这种入门级程序员,还是有学习的必要的...

开发JAX-RPC Web Services for WebSphere(下)

在开发JAX-RPCWebServicesforWebSphere(上)一文中,小编为大家介绍了如何创建一个Web服务项目、如何创建一个服务类和Web服务,以及部署项目等内容。接下来小编将为大...

CXF学习笔记1(cxf client)

webservice是发布服务的简单并实用的一种技术了,个人学习了CXF这个框架,也比较简单,发布了一些笔记,希望对笔友收藏并有些作用哦1.什么是webServicewebService让一个程序可...

分布式RPC最全详解(图文全面总结)

分布式通信RPC是非常重要的分布式系统组件,大厂经常考察的Dubbo等RPC框架,下面我就全面来详解分布式通信RPC@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》...

Oracle WebLogic远程命令执行0day漏洞(CVE-2019-2725补丁绕过)预警

概述近日,奇安信天眼与安服团队通过数据监控发现,野外出现OracleWebLogic远程命令执行漏洞最新利用代码,此攻击利用绕过了厂商今年4月底所发布的最新安全补丁(CVE-2019-2725)。由...

Spring IoC Container 原理解析(spring中ioc三种实现原理)

IoC、DI基础概念关于IoC和DI大家都不陌生,我们直接上martinfowler的原文,里面已经有DI的例子和spring的使用示例《InversionofControlContainer...

Arthas线上服务器问题排查(arthas部署)

1Arthas(阿尔萨斯)能为你做什么?这个类从哪个jar包加载的?为什么会报各种类相关的Exception?我改的代码为什么没有执行到?难道是我没commit?分支搞错了?遇到问题无法在...

工具篇之IDEA功能插件HTTP_CLENT(idea2021插件)

工具描述:Java开发人员通用的开发者工具IDEA集成了HTTPClient功能,之后可以无需单独安装使用PostMan用来模拟http请求。创建方式:1)简易模式Tools->HTTPCl...

RPC、Web Service等几种远程监控通信方式对比

几种远程监控通信方式的介绍一.RPCRPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.meth...

《github精选系列》——SpringBoot 全家桶

1简单总结1SpringBoot全家桶简介2项目简介3子项目列表4环境5运行6后续计划7问题反馈gitee地址:https://gitee.com/yidao620/springbo...

取消回复欢迎 发表评论: