Java中的并行分配?

Does Java have something similar to Python's [a, b, c] = (1, 2, 3) or PHP's list($a, $b, $c) = array(1, 2, 3)?

评论
  • 笑狠徦
    笑狠徦 回复

    Python多重分配非常强大,因为它也可以用于并行分配,如下所示:

    (x,y) = (y,x) # Swap x and y
    

    Java中没有并行分配的等效项。您必须使用一个临时变量:

    t = x; x = y; y = t;
    

    您可以像这样在一行中分配表达式中的多个变量:

    int a = 1, b = 2, c = 3;
    

    或从数组映射,您可以执行以下操作:

    int a = array[0], b = array[1], c = array[2];
    

    如果这看起来太冗长,则可以临时为您的分配数组创建一个单字母引用:

    int[] t = array;
    int a = t[0], b = t[1], c = t[2];
    

    更深入地了解问题的根源,在代码以列表或数组的形式将几个相关变量(可能是不同类型)一起传递的情况下,多重分配在Python中往往很方便。在Java(或C / C ++)中,更惯用的方法是创建一个小的数据类(或结构)以将这些变量捆绑在一起,并由生产者和消费者使用。然后,您可以按名称而不是按索引引用字段,如下所示:

    class Foo {
        public int a;
        public int b;
        public int c;
    }
    
    /* ... */
    
    Foo produceFoo() {
        Foo f = new Foo();
        f.a = 1;
        f.b = 2;
        f.c = 3;
        return f;
    }
    
    /* ... */
    
    Foo f = produceFoo();
    System.out.println(f.a + "," + f.b + "," + f.c);
    

    这也为以后的重构打开了大门,这将使Foo成为具有行为和封装的私有数据的真实类,而不仅仅是数据类。

  • asaepe
    asaepe 回复

    Try int[] list = {1,2,3}. This creates an integer array with values 1, 2 and 3 respectively.

  • lquia
    lquia 回复

    将并行分配添加到Java中并不难,我们实际上是在OptimJ语言扩展中实现的。但是它不存在。

    正如Derrick所提到的,原子交换语句需要并行分配。

    所谓的并行分配是一个更一般的概念的实例,该概念称为“解构分配”:您具有某种结构,并将其部分与变量匹配。

    假设您已嵌入元组,那么销毁分配可以提取任何级别的数据:

    (x, (y, z)) = ((1, 2, 3), (4, (5, 6)))
    // x = (1, 2, 3)
    // y = 4
    // z = (5, 6)
    

    假设您有一个列表或集合,则解构分配可以提取子列表或子集(x代表元素,x *代表子列表):

    [ x, y*, z ] = [ 1, 2, 3, 4 ]
    // x = 1
    // y = [ 2, 3 ]
    // z = 4
    

    显然,列表和集合可以嵌入到元组中。这个简单的方案提供了非常强大的编程抽象,一旦您需要提取数据就很有用。

  • 糖小果
    糖小果 回复

    Not really. You can do x = y = 0 to set several variables, but not a parallel assignment like Python.