因此,假设我在流上使用了一些随机过滤器,最直接的方法是直接输入谓词:
x.stream().filter(e -> e % 2 == 0)
Run Code Online (Sandbox Code Playgroud)
我也可以简单地做一个参考并提前定义谓词:
Predicate<Integer> isEven = e -> e % 2 == 0;
...
x.stream().filter(isEven)
Run Code Online (Sandbox Code Playgroud)
但我也可以使用一个函数:
private static boolean isEven(Integer integer) {
return integer % 2 == 0;
}
...
x.stream().filter(MyClass::isEven)
Run Code Online (Sandbox Code Playgroud)
据我所知,谓词当然更有限,而功能可能有副作用等.但由于像Venkat Subramaniam这样的人使用后者的解决方案,我真的很想知道:这里的主要区别是什么?
在这个问题中,已经回答说两个表达式都是相同的,但在这种情况下它们会产生不同的结果.对于给定的int[] scores,为什么这有效:
Arrays.stream(scores)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
......但这不是:
Arrays.asList(scores).stream()
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
据我所知,.stream()可以在任何Collection上调用,列表肯定是.第二个代码片段只返回一个包含整个数组的流而不是元素.
鉴于嵌套 ZIP 文件深处有一个秘密文件,即 zip 文件内的 zip 文件内的 zip 文件,等等......
这个zip文件命名1.zip,2.zip,3.zip,等...
我们不知道 zip 文件的嵌套深度,但可能有数千个。
循环遍历所有这些直到最后一个读取秘密文件的最简单方法是什么?
我最初的方法是unzip递归调用,但我的 Bash 技能有限。你有什么想法来解决这个问题?
我已经读过这篇相关的帖子了.在String操作方面,溪流似乎吸引了大量的仪式.如果要将String解析为可能需要执行某些操作的字符流,则需要将它们转换为IntStream第一个,映射到Object,然后转换为intto char,最后转换为charto String然后返回它.
人们说,命令式的节目编程有一个仪式开销.如果我完全做错了,请纠正我.我的目的不是嘲笑,而是更好地理解Java流,因为我一般都很欣赏它们.
// Simple method which encrypts all chars in a string
String input = "Hel!lo";
String result = input.chars() // Need to convert into an IntStream
.mapToObj(e -> Character.toUpperCase((char) e)) // Need to map to Object (!) and then cast to char
.map(CryptoMath::encryptChar) // Calling the encryption
.map(String::valueOf) // Need to cast to String again...
.collect(joining("")); // Finally done
System.out.println(result);
Run Code Online (Sandbox Code Playgroud) 这个问题绝对不是重复的,因为我不是指一般的 post/precrement 评估,而是专门指 lambda 表达式中增量的使用,这可证明是不同的。每个人都可以自由确认代码只会在您通常期望变量值增加的地方返回零。对此没有任何答复。
我很清楚后缀和前缀增量的不同评估和增量时刻。尽管如此,我还是不明白为什么这仅返回零:
Stream.iterate(0, e -> e++)
.limit(10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
检查时,我看到 e 在第一次迭代期间被初始化为 0,然后递增。所以第二次迭代应该产生 e = 1,但显然它没有。我错过了什么?
此外,如果我反转增量,它会按预期工作,列出从 0 到 9 的所有数字:
Stream.iterate(0, e -> ++e)
.limit(10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud) 这个简单的方法只是创建一个动态大小为 n 的数组,并用值 0 ... n-1 对其进行初始化。它包含一个错误,malloc() 仅分配 n 而不是 sizeof(int) * n 字节:
int *make_array(size_t n) {
int *result = malloc(n);
for (int i = 0; i < n; ++i) {
//printf("%d", i);
result[i] = i;
}
return result;
}
int main() {
int *result = make_array(8);
for (int i = 0; i < 8; ++i) {
printf("%d ", result[i]);
}
free(result);
}
Run Code Online (Sandbox Code Playgroud)
当您检查输出时,您会发现它会按预期打印一些数字,但最后的数字是乱码。然而,一旦我在循环中插入 printf() ,输出就出奇地正确,尽管分配仍然是错误的!是否有某种与 printf() 相关的内存分配?
所以我使用size_t而不是int在任何索引for循环中来防止负指数.但倒数时,这会导致溢出:
for (size_t i = 10; i >= 0; --i) {
// Do something, f.ex. array[i] = i
}
Run Code Online (Sandbox Code Playgroud)
什么是防止这种情况的好方法?
int而代替?我很感激任何反馈!
在x86汇编程序中,假设你有
为什么需要索引和基指针寻址模式?据我所知,每个都可以用循环代替.
间接模式似乎也没有太大用处,因为您可以简单地使用直接模式来引用内存地址.首先访问寄存器的目的是什么,然后包含指向存储器地址的指针?
简而言之,哪些寻址方式确实是必要的?
所以我没有任何以前的JS经验就完成了Typescript教程.我的问题是在给定的示例代码中,为什么可以将Student对象传递给以Person作为参数的greeter()函数?Student类从不实现所述接口,所以我想知道在Typescript类中是否自动实现接口.如果他们这样做,这背后的原因是什么?如果Car,Plane和Student都自动实现Person,那似乎毫无用处.
class Student {
fullName: string;
constructor(public firstName, public middleInitial, public lastName) {
this.fullName = firstName + " " + middleInitial + " " + lastName;
}
}
interface Person {
firstName: string;
lastName: string;
}
function greeter(person : Person) {
return "Hello, " + person.firstName + " " + person.lastName;
}
var user = new Student("Jane", "M.", "User");
document.body.innerHTML = greeter(user);
Run Code Online (Sandbox Code Playgroud) 标题几乎说了.我只能猜测,但我没有证据证明这一点.在Python中math.ceil(math.log(n) / math.log(2)).
上下文:我正在创建一个intbyte-to-char*二进制函数,它只显示必要的数字(id est没有尾随零),因此我需要为char数组动态分配内存.但是我假设存在一个上限,我可以用它来静态地确定长度.
编辑:看来我的方法是错的.要检查所需的数字量,只需将数字连续除以2直到它为0并跟踪分割量就会更快.