val listNumbers = generateSequence(1) { it + 1 }
val listNumber1to100 = listNumbers.takeWhile { it < 100 }
val secNum:Unit = listNumber1to100.forEach {it}
println(listNumber1to100.asSequence().filter { it%(listNumber1to100.forEach { it })!=0 }.toList())
我在提醒标志中有错误! 这是错误:使用提供的参数
无法调用以下任何函数答案 0 :(得分:0)
在第一种方法中,错误出现在此行中:
it%(listNumber1to100.forEach { it })
在Byte
运算符之后,首先Double
,Float
,Int
,Long
,Short
或%
但是,forEach是一个返回类型为Unit
的函数。
在第二种方法中,您在isPrime(Int)
中有正确的表达方式。以下是一些建议:
listNumber1to100
在您的代码中排除100,如果您想在listNumber1to100
中包含100,则传递给takeWhile
的lambda应更改为:
val listNumber1to100 = listNumbers.takeWhile { it <= 100 }
listNumber1to100.asSequence()
在这里是多余的,因为listNumber1too100
本身就是TakeWhileSequence
,它实现了Sequence
。
isPrime(Int)
有点混乱,因为它检查isComposite并且它不适用于它所采用的每一个输入(它仅适用于1到99)。我将以这种方式重写它:
fun isPrime(num: Int): Boolean = if (num <= 1) false else !(2..num/2).any { num % it == 0 }
由于素数必须为正数且1是特殊情况(既不是素数也不是复合数),如果输入小于或等于1,则只返回false。如果不是,则检查输入是否可被整除数字范围从2到(输入/ 2)。范围在(输入/ 2)之前结束,因为如果num % (num/2) == 0
为真,则num % 2 == 0
也是如此,反之亦然。最后,我在此之前添加了!
运算符,因为素数不应该被任何这些数字整除。
最后,您可以按isPrime(Int)
过滤列表:
println(listNumber1to100.filter(::isPrime).toList())
PS。它仅供参考,必须有比这更好的实现。
要回答关于it
的问题,it
表示lambda表达式中唯一的lambda参数。它始终用于function literal which has only one parameter。