热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java曾经有过配对类吗?——探讨Java中Pair类的历史与现状

本文探讨了Java中Pair类的历史与现状。虽然Java标准库中没有内置的Pair类,但社区和第三方库提供了多种实现方式,如ApacheCommons的Pair类和JavaFX的javafx.util.Pair类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含Pair类的原因,以及在现代Java开发中使用Pair类的最佳实践。

This question already has an answer here:

这个问题已经有了答案:

  • A Java collection of value pairs? (tuples?) 16 answers
  • 值对的Java集合?(元组)16个答案

Am I remembering incorrectly, or did Java, once upon a time, provide a Pair class as part of its API?

我是否记错了,或者Java,曾经,提供了一对类作为它的API的一部分?

10 个解决方案

#1


69  

There is no Pair in the standard framework, but the Apache Commons Lang, which comes quite close to “standard”, has a Pair.

在标准框架中没有对,但是Apache Commons Lang,它非常接近“标准”,有一对。

#2


50  

Java 1.6 and upper have two implementation of Pair (Map.Entry interface): AbstractMap.SimpleEntry and AbstractMap.SimpleImmutableEntry

Java 1.6和upper有两个实现的对(Map)。输入接口):AbstractMap。SimpleEntry和AbstractMap.SimpleImmutableEntry

I use it when need to store pairs (like size and object collection).

当需要存储对(比如大小和对象集合)时,我使用它。

This piece from my production code:

这是我的产品代码:

public Map>>>>>
        getEventTable(RiskClassifier classifier) {
    Map>>>>> l1s = new HashMap<>();
    Map>>> l2s = new HashMap<>();
    Map> l3s = new HashMap<>();
    List events = new ArrayList<>();
    ...
    map.put(l3s, events);
    map.put(l2s, new AbstractMap.SimpleImmutableEntry<>(l3Size, l3s));
    map.put(l1s, new AbstractMap.SimpleImmutableEntry<>(l2Size, l2s));
}

Code looks complicated but instead of Map.Entry you limited to array of object (with size 2) and lose type checks...

代码看起来很复杂,而不是映射。输入您限制为对象数组(大小为2)和丢失类型检查…

#3


31  

A Pair class :

两类:

public class Pair {

    private final K element0;
    private final V element1;

    public static  Pair createPair(K element0, V element1) {
        return new Pair(element0, element1);
    }

    public Pair(K element0, V element1) {
        this.element0 = element0;
        this.element1 = element1;
    }

    public K getElement0() {
        return element0;
    }

    public V getElement1() {
        return element1;
    }

}

usage :

用法:

Pair pair = Pair.createPair(1, "test");
pair.getElement0();
pair.getElement1();

Immutable, only a pair !

不可变,只有一对!

#4


14  

This should help.

这应该帮助。

To sum it up: a generic Pair class doesn't have any special semantics and you could as well need a Tripplet class etc. The developers of Java thus didn't include a generic Pair but suggest to write special classes (which isn't that hard) like Point(x,y), Range(start, end) or Map.Entry(key, value).

概括起来:一个普通的Pair类没有任何特殊的语义,您也可以需要一个Tripplet类等等。Java的开发人员没有包含一个通用的Pair,而是建议编写特殊的类(这并不是很困难),比如Point(x,y), Range(开始,结束)或者Map。条目(关键字,值)。

#5


13  

There are lots of implementation around here, but all the time something is missing , the Override of equal and hash method.

这里有很多实现,但是所有的时间都缺失了,比如重写了equal和hash方法。

here is a more complete version of this class:

下面是这个类的更完整版本:

/**
 * Container to ease passing around a tuple of two objects. This object provides a sensible
 * implementation of equals(), returning true if equals() is true on each of the contained
 * objects.
 */
public class Pair {
    public final F first;
    public final S second;

    /**
     * Constructor for a Pair.
     *
     * @param first the first object in the Pair
     * @param second the second object in the pair
     */
    public Pair(F first, S second) {
        this.first = first;
        this.secOnd= second;
    }

    /**
     * Checks the two objects for equality by delegating to their respective
     * {@link Object#equals(Object)} methods.
     *
     * @param o the {@link Pair} to which this one is to be checked for equality
     * @return true if the underlying objects of the Pair are both considered
     *         equal
     */
    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Pair)) {
            return false;
        }
        Pair p = (Pair) o;
        return Objects.equals(p.first, first) && Objects.equals(p.second, second);
    }

    /**
     * Compute a hash code using the hash codes of the underlying objects
     *
     * @return a hashcode of the Pair
     */
    @Override
    public int hashCode() {
        return (first == null ? 0 : first.hashCode()) ^ (secOnd== null ? 0 : second.hashCode());
    }

    /**
     * Convenience method for creating an appropriately typed pair.
     * @param a the first object in the Pair
     * @param b the second object in the pair
     * @return a Pair that is templatized with the types of a and b
     */
    public static  Pair  create(A a, B b) {
        return new Pair(a, b);
    }
}

#6


11  

No, but it's been requested many times.

没有,但是已经被要求过很多次了。

#7


5  

Many 3rd party libraries have their versions of Pair, but Java has never had such a class. The closest is the inner interface java.util.Map.Entry, which exposes an immutable key property and a possibly mutable value property.

许多第三方库都有它们的版本,但是Java从来没有这样的类。最接近的是内部接口java.util.Map。条目,它公开了一个不可变的键属性和一个可能的可变值属性。

#8


3  

If you want a pair (not supposedly key-value pair) just to hold two generic data together neither of the solutions above really handy since first (or so called Key) cannot be changed (neither in Apache Commons Lang's Pair nor in AbstractMap.SimpleEntry). They have thier own reasons, but still you may need to be able to change both of the components. Here is a Pair class in which both elements can be set

如果您想要一对(而不是所谓的键值对),只需要将两个通用数据放在一起,这两种解决方案都不能真正方便地使用,因为第一个(或所谓的密钥)是不能更改的(在Apache Commons Lang的pair中,也不是在AbstractMap.SimpleEntry中)。他们有自己的理由,但是你可能需要改变这两个组件。这是一个对两个元素都可以设置的类。

public class Pair {
    private First first;
    private Second second;

    public Pair(First first, Second second) {
        this.first = first;
        this.secOnd= second;
    }

    public void setFirst(First first) {
        this.first = first;
    }

    public void setSecond(Second second) {
        this.secOnd= second;
    }

    public First getFirst() {
        return first;
    }

    public Second getSecond() {
        return second;
    }

    public void set(First first, Second second) {
        setFirst(first);
        setSecond(second);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Pair pair = (Pair) o;

        if (first != null ? !first.equals(pair.first) : pair.first != null) return false;
        if (second != null ? !second.equals(pair.second) : pair.second != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = first != null ? first.hashCode() : 0;
        result = 31 * result + (second != null ? second.hashCode() : 0);
        return result;
    }
}

#9


1  

It does seem odd. I found this thread, also thinking I'd seen one in the past, but couldn't find it in Javadoc.

这似乎很奇怪。我发现了这个线程,也认为我曾经看到过一个线程,但是在Javadoc中找不到它。

I can see the Java developers' point about using specialised classes, and that the presence of a generic Pair class could cause developers to be lazy (perish the thought!)

我可以看到Java开发人员使用专门化类的观点,并且一个泛型对类的存在可能会导致开发人员懒惰(破坏思想!)

However, in my experience, there are undoubtedly times when the thing you're modelling really is just a pair of things and coming up with a meaningful name for the relationship between the two halves of the pair, is actually more painful than just getting on with it. So instead, we're left to create a 'bespoke' class of practically boiler-plate code - probably called 'Pair'.

然而,在我的经验中,毫无疑问的是,当你做模特的时候,你所做的只是一件事,并且为这两个人之间的关系想出一个有意义的名字,实际上比仅仅做一件事要痛苦得多。因此,我们只能创建一个“定制”类的实际样板代码——可能叫做“Pair”。

This could be a slippery slope, but a Pair and a Triplet class would cover a very large proportion of the use-cases.

这可能是一个滑坡,但一对和一个三胞胎班将涵盖很大比例的用例。

#10


0  

No but JavaFX has it.

不,但是JavaFX有。

Cf. Stack Overflow: Java Pair class implementation

堆栈溢出:Java对类实现。


推荐阅读
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 蓝桥杯物联网基础教程:通过GPIO输入控制LED5的点亮与熄灭
    本教程详细介绍了如何利用STM32的GPIO接口通过输入信号控制LED5的点亮与熄灭。内容涵盖GPIO的基本配置、按键检测及LED驱动方法,适合具有STM32基础的读者学习和实践。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 如何在IntelliJ IDEA中生成Maven项目的所有Jar包依赖关系图
    本文详细介绍了如何在IntelliJ IDEA中生成Maven项目的完整Jar包依赖关系图。通过具体步骤和示例,帮助开发者清晰地理解并掌握这一重要功能,适合希望深入了解Maven依赖管理的读者学习参考。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
  • 经过半年的精心整理,我们汇总了当前市场上最全面的Android面试题解析,为移动开发人员的晋升和加薪提供了宝贵的参考资料。本书详细涵盖了从基础到高级的各类面试题,帮助读者全面提升技术实力和面试表现。章节目录包括:- 第一章:Android基础面试题- 第二章:... ... [详细]
  • Java集合框架特性详解与开发实践笔记
    Java集合框架特性详解与开发实践笔记 ... [详细]
author-avatar
赵娜supergirl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有