Параллельное назначение в Java?

Есть ли у Java что-то похожее на Python [a, b, c] = (1, 2, 3) или PHP list($a, $b, $c) = array(1, 2, 3)?

Ответ 1

Не совсем. Вы можете сделать x = y = 0, чтобы установить несколько переменных, но не параллельное назначение, такое как Python.

Ответ 2

Множественное назначение 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/С++) более идиоматическим способом сделать это было бы создание небольшого класса данных (или структуры) для объединения этих переменных вместе, и как производитель, так и потребитель используют его. Затем вы можете ссылаться на поля по имени, а не по индексу, например:

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 настоящим классом с поведением и инкапсулированными частными данными, а не только классом данных.

Ответ 3

Попробуйте int[] list = {1,2,3}. Это создает целочисленный массив со значениями 1, 2 и 3 соответственно.

Ответ 4

Параллельное назначение не составит труда добавить к Java, мы фактически внедрили его в нашем расширении языка OptimJ. Но его просто нет.

Как упоминает Деррик, для оператора атомного свопа требуется параллельное назначение.

То, что вы называете параллельным назначением, является экземпляром более общей концепции, называемой "назначение деструктуризации": у вас есть некоторая структура, и вы сопоставляете ее части с переменными.

Предположим, что у вас встроенные кортежи, тогда деструкция присваивания может извлекать данные на любом уровне:

(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

Очевидно, что списки и наборы могут быть встроены в кортежи. Эта простая схема обеспечивает очень мощные абстракции программирования, полезные, как только вам нужно извлечь данные.