从Java方法返回多个值:为什么没有n元组对象?

Sak*_*ket 48 java methods return-type

为什么没有(标准的,Java认证的)解决方案,作为Java语言本身的一部分,从Java方法返回多个值,而不是开发人员必须使用他们自己的方法,如地图,列表,对等.?为什么Java不支持n元组对象?

特别是考虑可以将两个对象一起修改(串联)的普通私有方法,并且在这种情况下作为返回的类型对象听起来有点过分.

Ada*_*ent 54

我假设OP意味着"为什么Java不支持n元组对象?".Python,Haskell,Lisp,ML等具有异构的n元组功能.通常,在语言中显然返回多个对象的能力也是语法糖(即在python中返回'a','b').

当然,原因是语言设计和一致性.Java更喜欢非常明确,不喜欢匿名数据结构(虽然我希望我们有匿名闭包).

例如在Java中,没有办法说我想要一个带有这些类型参数的回调并返回它.有些人认为这是一个巨大的弱点,其他人喜欢一致性和明确性.

恕我直言,虽然它很烦人我经常通过制作静态内联类来解决这个问题:

private static class Combo {
   String name;
   int weight;
}
Run Code Online (Sandbox Code Playgroud)

是的,它很乏味但后来我经常重用和重构那些使它们成为顶级并添加行为的类.实际上,采用这种方法的一个优点是,更容易添加新字段,即匿名数据结构(如FP语言),添加字段变得更加困难(最终会更改大量代码).

我应该注意,对于2元组,有些人使用(或滥用),java.util.Map.Entry因为java.util.AbstractMap.SimpleEntryJava 6中有一个.还有一些人现在使用Commons Lang3的Pair支持(2元组).

Scala有一些n-tuple支持作弊,并且拥有一大堆2-16个元组接口,这些接口是语言中的标准接口,并且在语法上对程序员隐藏起来.

出于纯粹的教育原因,您可能希望了解其他语言如何实现这一目标.

更新:适用于Java 8

Java 8将/可能(因此,我的号码......请给我打电话)支持一个叫做java.lang.BiValue具有你可以使用的具体实现的接口java.lang.BiVal.这些类有助于支持新的lambda功能.但请注意,这仅适用于2元组.

更新:2015年

Java的8并没有获得元组的支持.

更新:来自作者2015

如果你仍然想要元组支持,那么有三个库可以很好地支持元组:

  • javatuples - 支持JDK 5及更高版本.最多10元组.
  • JOOλ - 来自jOOQ的作者但需要JDK 8.
  • Commons Lang 3 - 现在支持Triple(3元组)并支持JDK 6及更高版本.

  • Map.Entry是我的最爱.为什么要为其他语言动态执行的简单任务创建命名对象? (10认同)
  • 给Carly Rae Jepsen引用+1 (7认同)
  • +1 表示在面对不断变化的情况时返回并实际更新答案。我希望更多的人这样做。 (3认同)

DwB*_*DwB 8

Java方法返回零或一个值; 这 java的标准.如果需要返回多个值,请创建具有多个值的对象并将其返回.

  • 这不是"为什么不存在"问题的答案 (5认同)
  • 唯一的问题是,对于一个非常微不足道的(私人)方法,它有时听起来有点过分...... (4认同)

Psy*_*ist 5

如果您想返回两个对象,您通常希望返回一个封装了这两个对象的对象。


Tra*_*vis 5

有很多黑客方法可以实现这一点,一种方法是返回一个Object[],但是你需要担心索引,并且空指针检查,它只会变得令人讨厌。另一种方法是返回 a String,但是你必须解析它,这会变得很糟糕。

我认为真正的问题是为什么?

问题是——如果我和你一起开发一个项目,并且我看到了这种类型的行为,我会重写它,这样你就可以看到应该如何处理它。如果您提供代码示例,我将重写它以进行说明。

编写具有单一职责的方法,如果它们需要返回比其能力更多的数据,您可能应该使用一个对象,或者将其分解为更小的方法。