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)
实际上我需要从函数 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 上的相关问题: