对象数组的Java流缩减

对象数组的Java流缩减,java,java-8,java-stream,reduce,Java,Java 8,Java Stream,Reduce,我有一个由2个对象组成的数组列表: List<Object[2]> 您可以使用reduce()实现这一点: public void testStacko(){ 列表=新的ArrayList(); 添加(新对象[]{1,“foo”}); 添加(新对象[]{6,“| bar”}); 添加(新对象[]{15,“|baz”}); Object[]数组=list.stream() .减少( (obj1,obj2)-> 新对象[]{(int)obj1[0]*(int)obj2[0], (字符串

我有一个由2个对象组成的数组列表:

List<Object[2]>

您可以使用
reduce()
实现这一点:

public void testStacko(){
列表=新的ArrayList();
添加(新对象[]{1,“foo”});
添加(新对象[]{6,“| bar”});
添加(新对象[]{15,“|baz”});
Object[]数组=list.stream()
.减少(
(obj1,obj2)->
新对象[]{(int)obj1[0]*(int)obj2[0],
(字符串)obj1[1]+(字符串)obj2[1]
}
)
.get();
System.out.println(数组[0]);//90
System.out.println(数组[1]);//foo | bar | baz
}

您已经得到了一个很好的技术答案,所以让我们添加一个不同的非答案

这里的:
列表
感觉很不对

为什么不使用类似于:
List

换句话说:不要轻易放弃类型信息。不要将
Object[]
误用为无类型容器,以填充已键入的内容。Java是一种静态编译的语言。意思是:不要抵制泛型和严格类型的力量,相反,要随波逐流

答案代码变成:

.reduce(p1, p2 -> new Pair<>(p1.first * p2.first, p1.second + p2.second))
.reduce(p1,p2->新对(p1.first*p2.first,p1.second+p2.second))

严肃地说:它从使用
Object[]
开始。。。最后你切换到ruby,因为动态输入

对于JDK-12,您可以使用

Object[] array = list.stream()
    .collect(Collectors.teeing(
        Collectors.reducing(1, a -> (Integer)a[0], (a,b) -> a * b),
        Collectors.mapping(a -> (String)a[1], Collectors.joining()),
        (i,s) -> new Object[] { i, s}
    ));
但你真的应该重新考虑你的数据结构


显示了在Java 8下工作的
teeing
收集器的一个版本。

我同意,有一对更好。因为我的列表有两个以上的对象。我给出了两个对象列表作为示例。在有两个对象的情况下,Pair肯定更好。@Noor那么,任何用名称和类型定义不同字段的类类型都比一组不同类型的元素要好,这些元素的含义必须从它们的位置猜出来。@Holger同意。我现在正在处理一个POC,将有一个类来保存所有这些对象。我只是想知道如何在流对象上执行不同的功能。但是对于较大的列表来说,这样做效率很低。@GhostCat我总是想到T连接器或Unix命令
tee
。我不知道“发球”这个词是否早于这个词。
.reduce(p1, p2 -> new Pair<>(p1.first * p2.first, p1.second + p2.second))
Object[] array = list.stream()
    .collect(Collectors.teeing(
        Collectors.reducing(1, a -> (Integer)a[0], (a,b) -> a * b),
        Collectors.mapping(a -> (String)a[1], Collectors.joining()),
        (i,s) -> new Object[] { i, s}
    ));