我有这样的代码示例。
import java.util.LinkedList;
import java.util.List;
import java.util.stream.LongStream;
public class RemovedNumbers {
public static List<long[]> removNb(long n) {
System.out.println(n);
long sum = ((n + 1) * n / 2);
long minMultiplication = sum - 2 * n + 1;
long minCandidate = (long) Math.sqrt(minMultiplication);
LinkedList<long[]> list = new LinkedList<>();
LongStream.rangeClosed(minCandidate, n)
.mapToObj(a -> new long[]{a, calculateB(a, sum)})
.filter(longs -> longs[0] > longs[1])
.filter(longs -> longs[1] <= n)
.filter(longs -> longs[0] * longs[1] == sum - longs[0] - longs[1])
.forEach(longs -> addArrays(list, longs));
return list;
}
private static long calculateB(long a, long sum) {
return (sum - a) / (a + 1);
}
private static void addArrays(final LinkedList<long[]> list, final long[] longs) {
list.addFirst(new long[]{longs[1], longs[0]});
list.add(longs);
}
}
这段代码在 LongStream 部分对我来说很复杂。 我没有得到一些分数,所以我需要帮助:
我检查了 LongStream 类。
此类使用四种方法:rangeClosed、mapToObj、filter、forEach(我在 Java 文档中找到了它们的描述)。不幸的是,现在我开始检查 java 1.8 版本,所以我无法理解它是如何工作的以及发生了什么。
"a"
mapToObj出现在哪里?它是什么?"a"
我在前面的代码部分没有看到 var声明。
因为我有 lambda 是由这样的方案制作的:(arguments) -> (body)
. 所以 the"a"
是一个论点,"new long[]..."
- 是一个主体。这部分对我来说没有任何问题。但是下一个 whereis "longs"
- 论点,“longs[0] > longs[1]” - body,引起了一些问题。什么是变量"longs"
?以前没有申报过!它是如何出现的?这个怎么运作?
LongStream 类可以写在一行中,我说得对吗?喜欢:LongStream.rangeClosed().filter().filter().filter().forEach(); ?
所有方法都因此执行,我说得对吗?靠彼此?第一个rangeClosed,然后是mapToObj,然后是filter……还是有别的顺序?
非常感谢!
MMMHUHU
暮色呼如
函数式编程
SMILET
相关分类