我的问题基本上归结为将列表减少为链表,但从reduce函数推断出的类型似乎不正确。
我的列表如下所示
[0, 1, 2]
我希望reduce函数在每个reduce步骤中都能做到这一点
null // identity (a Node)
Node(0, null) // Node a = null, int b = 0
Node(1, Node(0, null)) // Node a = Node(0, null), int b = 1
Node(2, Node(1, Node(0, null))) // Node a = Node(1, Node(0, null)), int b = 2
然而,减少函数似乎认为这不起作用,因为我猜它不认为身份是节点。
这是我的密码。
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Example {
static class Node {
int value;
Node next;
public Node(int value, Node next) {
this.value = value;
this.next = next;
}
}
static Node reverse(List<Integer> list) {
return list.stream()
.reduce(null, (a, b) -> new Node(b, a)); // error: thinks a is an integer
}
void run() {
List<Integer> list = IntStream.range(0, 3)
.boxed()
.collect(Collectors.toList());
Node reversed = reverse(list);
}
public static void main(String[] args) {
new Example().run();
}
}
我做错了什么?
在接受答案后编辑,我的代码如下所示:
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Example {
static class Node {
int value;
Node next;
public Node(int value, Node next) {
this.value = value;
this.next = next;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
", next=" + next +
'}';
}
}
static Node reverse(List<Integer> list) {
return list.stream()
.reduce(null, (n, i) -> {
System.out.println("Will happen"); // to demonstrate that this is called
return new Node(i, n);
}, (n1, n2) -> {
System.out.println("Won't happen"); // and this never is
return new Node(n1.value, n2);
});
}
void run() {
List<Integer> list = IntStream.range(0, 3)
.boxed()
.collect(Collectors.toList());
Node reversed = reverse(list);
System.out.println(reversed);
}
public static void main(String[] args) {
new Example().run();
}
}
现在打印出来了
Will happen
Will happen
Will happen
Node{value=2, next=Node{value=1, next=Node{value=0, next=null}}}
我仍然不知道为什么Java不能告诉减少函数的第三个参数是不必要的,它永远不会被调用,但这是另一个问题。
第二次编辑
可以为reduce操作创建一个新方法,因为reduce的第三个参数可以是一个不做任何操作的函数。
static <T, U> U reduce(Stream<T> stream, U identity, BiFunction<U, ? super T, U> accumulator) {
return stream.reduce(identity, accumulator, (a, b) -> null);
}
static Node reverse(List<Integer> list) {
return reduce(list.stream(), null, (n, i) -> new Node(i, n));
}
您所面临的问题是reduce期望返回它所累积的相同类型。在这种情况下,null是一个整数,与a一样
您可以做的是将每个整数
映射到节点
,然后将节点缩减为链表。
static Node reverse(List<Integer> list) {
return list.stream()
.map(i -> new Node(i, null))
.reduce(null, (a, b) -> {
b.next = a;
return b;
});
}
void run() {
List<Integer> list = IntStream.range(0, 3)
.boxed()
.collect(Collectors.toList());
Node reversed = reverse(list);
for(Node n = reversed; n != null ; n = n.next)
System.out.println(n.value);
}
印刷品
2
1
0
您可以使用另一个reduce操作符
static Node reverse(List<Integer> list) {
return list.stream()
.reduce(
(Node) null, //the empty element
(n, i) -> new Node(i, n) , //combining a Node and an Integer
(n1, n2) -> new Node(n1.value, n2)); // could be anything
}
编辑:使其与并行流一起工作:
public static Node merge(Node n1, Node n2) {
if (n1 == null) {
return n2;
} else {
return new Node(n1.value, merge(n1.next, n2));
}
}
static Node reverse(List<Integer> list) {
return list.stream()
.reduce(
(Node) null, //the empty element
(n, i) -> new Node(i, n) , //combining a Node and an Integer
(n1, n2) -> merge(n1, n2)); // combining two Nodes
}
对不起,如果这是显而易见的一些你们,但我还没有找到任何例子,如何实现这一点。我以为这可以通过Stream.Reduce(U恒等式、双吸累加器、BinaryOperator组合器)来完成,但到目前为止我还没有成功。如果有人能为此提供一些示例代码,我相信它也会受到许多其他人的赞赏。
我试图转置我的数据,以便它是每个键的元组列表,而不是数据列。 作为我的投入: 我希望将输出写入拼花文件: 作为输入,我有两组拼花地板数据。我阅读它们并将其作为数据帧加入。然后我将每一行映射到键值对,然后将每个键还原为元组的大列表。 这里PARTITION_SIZE只是我为每次运行设置的一个变量,用于将数据分割成该大小的块。所以,如果我输入100000,并且有200万记录,那么编号为0-99,999
我试图使用Java8 groupby和reduce特性来根据分组对元素求和,但代码似乎不适合我。 我的要求是,对于每一个DTO对象,我希望这个公里数根据卡车车组进行汇总。因此,突出显示的列应该是同一个TruckId(**Contract flotte)的值的总和 这是我的DTO: "'公共类CostsTruckWsDTO实现可序列化{ 以下是逻辑:''costsTruckWsDTO。setGrou
我有一个java。util。流动包含键值对的流,如: 现在,我想合并所有具有相同密钥的条目: 数据已经排序,因此只需合并连续的数据集。 现在,我正在寻找一种方法来转换上述流的内容,而不将所有数据集加载到内存中。 我更喜欢得到一个java.util.stream.Stream,结果是一个不同的对象类型包含一个值列表,而不是一个单独的值。 我唯一的方法是一个自定义迭代器,它执行合并,但是转换为迭代器并
但是,此修复: 有没有更优雅的方式这样做?
我想迭代一个对象列表。每个对象都包含一些对象的变量。更具体地说: 我的名单是: 所需的映射结构是: