Java 8+ 使用 Lambda 或 Stream 从单例对象中解包原语? Java 中的结构化绑定?

Java 8+ Unpacking Primitives From Singleton Objects Using Lambda or Stream? Structured Binding in Java?

实际上我需要从函数 return 中取出数据子集,但我实际上并不需要 returned 对象。那么,有没有一种方法可以简单地使用 Stream 或类似 Lambda 的语法获取我需要的内容?是的,我知道你可以使用 stream().map() 将值放入一个数组,然后将数组分解为命名变量,但对于功能等效的代码来说,这更加冗长。

在 C++ 中,这称为结构化绑定,但我在搜索时似乎遗漏了 Java 术语。

我好像被逼写的程序代码:

HandMadeTuple<Integer, Integer, ...> result = methodICurrentlyCall(input);
int thing1 = result.getFirst();
int thing2 = result.getSecond();
...
//thingX's get used for various purposes. Result is never used again.

我希望能够编写的声明性代码:

int thing1, thing2;
(methodICurrentlyCall(input)) -> (MyType mt) { thing1 = mt.getFirst(); thing2 = mt.getSecond(); };

int thing1, thing2;
Stream.of(methodICurrentlyCall(input)).forEach((mt) -> { thing1 = mt.getFirst(); thing2 = mt.getSecond();} 

有一个非常笨拙的 hack:数组。

final int[] thing1 = {0}, thing2 = {0};
Stream.of(methodICurrentlyCall(input))
  .forEach(mt -> {
    thing1[0] = mt.getFirst();
    thing2[0] = mt.getSecond();
  });

数组引用是最终的,因此您可以在 lambda 中使用它。

我不推荐这个!它既不短也不容易理解

(另一种选择是使用 AtomicReference<T>AtomicInteger/AtomicLong 而不是数组,但保证原子更新的开销很小)


如果您正在寻找 Java 的模式匹配或解构支持,这可以在 Java 的未来版本中实现,请参阅 SO 上的相关问题: (even more details at https://cr.openjdk.java.net/~briangoetz/amber/serialization.html)