`

Java元组学习

阅读更多
       在Java 中我们平时用的接口和方法 只是单一的返回某一个对象 有时候,我们需要同时返回两个不同的对象,这时候就需要用到元组数据结构(ps:自己最早接触元组 是在scala语言中 有兴趣朋友可以去看一下,也是一种函数式编程思想。)元组可以灵活的在一个方法中同时返回你想要的两个结果。不用再去构建新的代码去接受。

public class Tuple {

    public static <V1, V2> Tuple2<V1, V2> of(V1 v1, V2 v2) {
        return new Tuple2<>(v1, v2);
    }

    public static <V1, V2, V3> Tuple3<V1, V2, V3> of(V1 v1, V2 v2, V3 v3) {
        return new Tuple3<>(v1, v2, v3);
    }

}


public class Tuple2<V1, V2> {


    private final V1 v1;

    private final V2 v2;


    public Tuple2(V1 v1, V2 v2) {
        this.v1 = v1;
        this.v2 = v2;
    }
    public static <V1, V2> Tuple2<V1, V2> of(V1 v1, V2 v2) {
        return new Tuple2<>(v1, v2);
    }

    public V1 _1() { return v1; }

    public V2 _2() { return v2; }

    @Override
    public String toString() {
        return "(" + v1 + "+" + v2 + ")";
    }

    /**
     * 重写hashcode
     *
     * @return 用31 可以减少hashcode值在范围内值冲突 以及31可以被JVM优化
     * <p>
     * * 左移 << : 左边的最高位丢弃,右边补全0(把 << 左边的数据*2的移动次幂)。
     * * 右移 >> : 把>>左边的数据/2的移动次幂。
     * * 无符号右移 >>> : 无论最高位是0还是1,左边补齐0。
     * <p>
     * 所以 : 31 * i = (i << 5) - i(左边  31*2=62,右边   2*2^5-2=62) - 两边相等,JVM就可以高效的进行计算啦。。。
     */
    @Override
    public int hashCode() {
        int result = v1.hashCode();
        result = 31 * result + v2.hashCode();
        return result;
    }

    /**
     * 重写equals 方法
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        //对象为空,或者引用地址不等 返回 false
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        // 值不等返回false
        Tuple2<?, ?> tuple2 = (Tuple2<?, ?>) obj;
        if (!v1.equals(tuple2.v1)) return false;
        return v2.equals(tuple2.v2);
    }
}





public class Tuple3<V1,V2,V3> {

    private final V1 v1;
    private final V2 v2;
    private final V3 v3;

    public Tuple3(V1 v1, V2 v2, V3 v3) {
        this.v1 = v1;
        this.v2 = v2;
        this.v3 = v3;
    }

    public static <V1, V2, V3> Tuple3<V1, V2, V3> of(V1 v1, V2 v2, V3 v3) {
        return new Tuple3<>(v1, v2, v3);
    }

    public V1 _1() {
        return v1;
    }

    public V2 _2() {
        return v2;
    }

    public V3 _3() {
        return v3;
    }

    @Override
    public String toString() {
        return "(" + v1 + "," + v2 + "," + v3 + ')';
    }

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

        Tuple3<?, ?, ?> tuple3 = (Tuple3<?, ?, ?>) o;

        if (!v1.equals(tuple3.v1))
            return false;
        if (!v2.equals(tuple3.v2))
            return false;
        return v3.equals(tuple3.v3);

    }

    @Override
    public int hashCode() {
        int result = v1.hashCode();
        result = 31 * result + v2.hashCode();
        result = 31 * result + v3.hashCode();
        return result;
    }


}




测试:
package com.stduy;
import com.stduy.Tuple.Tuple2;
import java.util.ArrayList;
import java.util.List;
import static java.lang.System.out;

/**
 * @author zhangkun
 * @create 2018-12-17 10:16 AM
 * @desc
 **/

public class TupleTest {

    public static void main(String[] args) {

      Tuple2<String, List> tuple =  testTuple();
      out.println(tuple._1());
      List<Integer> list =  tuple._2();
      list.stream().forEach(out::println);
    }

    public static Tuple2<String,List>  testTuple(){
        List<Integer> longList = new ArrayList<>(3);
        longList.add(1);
        longList.add(2);
        longList.add(3);
        return Tuple2.of("test",longList);
    }
}


打印值为下;
Connected to the target VM, address: '127.0.0.1:51475', transport: 'socket'
test
1
2
3
Disconnected from the target VM, address: '127.0.0.1:51475', transport: 'socket'


看完 是不是觉得这种元组数据结构在某些地方用起来很方便呢。








分享到:
评论

相关推荐

    Python 元组-元组变量的循环遍历

    Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统...

    Python 元组-元组和格式化字符串

    Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统...

    Java python 个人学习笔记

    这份"Java Python 个人学习笔记"涵盖了这两种语言的基础知识、进阶技巧以及可能的结合应用。 Java是一种面向对象的、高性能的编程语言,由Sun Microsystems(现为Oracle公司)开发,其设计目标是“一次编写,到处...

    pair:用于在 Java 中创建元组的小包

    标题提到的"pair:用于在 Java 中创建元组的小包"可能是一个专门为Java提供元组支持的开源项目,它简化了在Java中处理两个值的数据结构的需求。 元组是一种轻量级的数据结构,它可以存储多个不同类型的数据,并且不...

    Python -函数的返回值-接收返回元组函数的方式

    Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统...

    JAVA、Python学习

    2. **数据结构**:包括列表、元组、字典、集合等,以及操作它们的方法。 3. **控制结构**:条件语句、循环结构、异常处理等。 4. **函数与模块**:函数的定义、参数传递,以及如何组织代码为模块。 5. **面向对象...

    2048:游戏 2048 的 N 元组网络

    游戏 2048 的 N 元组网络 此代码允许使用 n 元组网络作为游戏 2048 的评估函数。有关更多信息,请访问 作者 Marcin Szubert ( ) Wojciech Jaśkowski ( ) Paweł Liskowski ( ) 建造 您需要 Java 1.7 和 Maven。 ...

    有java基础快速学Python摘要

    对于已经有一定编程基础,特别是熟悉Java的开发者来说,学习Python可以更快上手。Python以其简洁明了的语法和强大的功能深受程序员喜爱。下面是一些Python的关键知识点,着重突出与Java的不同之处。 1. **参数接收...

    Python 元组-特点以及和列表的区别

    Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统...

    java学习与巩固

    【Java学习与巩固】 Java是一种广泛使用的面向对象的编程语言,具有丰富的库支持、跨平台兼容性和高效性能。本文件提供了全国计算机等级考试二级Java模拟试题,帮助学习者加深对Java语言的理解和掌握。 1. 数据的...

    Python 元组-元组变量的定义

    Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统...

    Python 元组-元组的应用场景

    Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统...

    物件導向程式設計講義-Java

    知识点详述: ...通过上述知识点的梳理,我们不仅了解了Java的基础语法和物件导向的特性,还掌握了如何在Java中进行有效的数据管理和程序控制,为进一步深入学习Java和物件导向程式设计奠定了坚实的基础。

    Python 元组-元组变量的常用操作

    Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统...

    学习Java和Python爬虫.zip

    本压缩包"学习Java和Python爬虫.zip"显然是一个教育资源,旨在帮助初学者掌握这两种主流编程语言的网络爬虫技术。Java和Python都是广泛应用于爬虫开发的语言,各自拥有独特的优点和适用场景。 Java爬虫: Java作为...

    Python笔记(二)【字典+元组+集合+字符串】.pdf

    这些内容对于拥有C和Java编程语言基础的学习者来说,在已有知识基础上进一步拓展Python的数据处理能力尤为重要。 首先来谈谈字典。在Python中,字典是一种内置的数据结构,它是一种可变的容器模型,并且可以存储...

    Python 元组-元组和列表之间的转换

    Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将Python置于Java、C和JavaScript之上,真的非常荣幸了. 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统...

    基于Java教你如何半小时搞定python基础

    此外,Python还有列表(list)、元组(tuple)、集合(set)和字典(dict)等复合数据类型,它们分别对应Java的ArrayList、数组、HashSet和HashMap。 在Python中,函数定义使用`def`关键字,函数可以作为返回值,...

    Python-Leetcode的Python和JAVA解决方案

    总结,"Python-Leetcode的Python和JAVA解决方案"这个资料集包含了两种主流编程语言在解决算法问题时的具体实践,通过学习这些代码,不仅可以提升编程能力,还能深入理解数据结构和算法,为日常开发和面试准备打下...

    My anki cards' backups. Java、大数据、数据结构八股文。.zip

    描述中的“大学生 C/C++/JAVA/Python数据结构学习笔记和资料大全”揭示了这是一个针对不同编程语言(C、C++、Java和Python)的数据结构学习资源集合。数据结构是计算机科学的基础,对于任何编程语言的学习者来说都是...

Global site tag (gtag.js) - Google Analytics