java中的一次多赋值

44u64gxh  于 2022-12-25  发布在  Java
关注(0)|答案(4)|浏览(220)

在python中,你可以这样做:

def f():
    return 1, 2, 3
(foo, bar, baz) = f()

在java中有等价的吗?

2g32fytz

2g32fytz1#

**tl;dr:**不,Java中没有这样的东西。

你可以像这样给变量赋值:

int foo = 1, bar = 2;

但是如果你想让(1, 2, 3)成为一个方法调用的结果,这在Java中是不可能的,Java不允许返回多个值。
Python允许:

def foo():
    return 1, 2, 3

a, b, c = foo()

这在Java中不起作用的主要原因是,赋值的左手(LHS)必须是 * 一个 * 变量:

Wrapper wrapper = WrapperGenrator.generateWrapper();

你不能像在Python中那样在LHS上赋值给元组。

carvr3hs

carvr3hs2#

如果你想让(1,2,3)成为一个方法调用的结果,你可以使用一个数组:

int[] arr = {1,2,3};
afdcj2ne

afdcj2ne3#

我知道这是一个老职位,但我可以指出一种方式来有点接近这一点。
使用OP的示例(显然可以使用多个类型而不是三个int,但我使用的是原始示例),

class Trip{ int foo;int bar;int baz;} // After building this class, have your editor create a constructor for you!

public Trip() {
    return new Trip(1,2,3);
}

Trip t = f()

现在,我意识到您实际上并没有像您希望的那样将此变量赋值给三个局部变量(或成员变量),但是您确实有一个局部变量可以使用,就像您有......一样:

t.foo * t.bar + t.baz;

这里的优点是,这是相当简洁,几乎没有比python的例子更多的工作,更安全/更清晰/更容易阅读;因为我会很高兴的!
也许更重要的是,当你继续下去的时候,你会意识到这个迷你类应该沿着是一个真正的类,因为它们来自同一个函数,所以它们的值会有一定的关联!
您可以通过简单的编辑器重构将现有的类更改为真实的的类--用getter/setter替换成员访问,使成员私有化,将类提取到它自己的文件中,这样您就拥有了一个完整的类!
很有可能您最终会发现原来的函数f()本来就应该是这个类的成员(或构造函数)!
顺便说一下,缺点是这会完全触发一些Java程序员,他们不明白规则是用来被打破的--如果您有一些老程序员,他们坚持一些看起来迂腐的东西(规则痴迷),最好不要尝试,因为这会使他们的头爆炸(很可能是你的头)。

nkkqxpd9

nkkqxpd94#

正如我在this other question中提到的,如果您的目标是从一个函数返回多个值,那么在Java 16+中,您可以使用记录类型来完成类似的任务:

record FooResult(int a, int b, int c) { }

FooResult produceFoo() {
    return new FooResult(1, 2, 3);
}

/* ... */

var f = produceFoo();
System.out.println(f.a + "," + f.b + "," + f.c);

这将允许你返回任何类型集,带有命名字段,代价是必须添加一行来声明记录,但是这对(i, j) = (j, i)这样的赋值语句没有什么帮助。

相关问题