我是Kotlin的新手并且已经多次读过Kotlin的Null Safety,但我真的很困惑,并且不清楚.谁能帮我回答下面的问题:
什么!
字符fun getString(key: String!)
意味着什么?
以下运算符的名称是否正确:
?.
:安全呼叫运营商
?:
:猫王运营商
!!
:当然是运营商
?:
运营商和?.let
?之间有什么区别?我什么时候应该使用每一个?是否有一种优雅/惯用的方式来检查Kotlin,一个列表中的元素是否包含在另一个列表中?
鉴于:
val listA = listOf("A", "B", "C")
Run Code Online (Sandbox Code Playgroud)
我可以写如下表达式:
listA.intersect(setOf("E", "C")).isNotEmpty()
Run Code Online (Sandbox Code Playgroud)
要么:
listA.any { it in listOf("E","C") }
Run Code Online (Sandbox Code Playgroud)
可以,但是我想知道是否还有一种更流畅的方式来表达它(因为此代码经过简化,所以实际代码更加复杂)。
我的后备方法是使用自定义扩展功能,例如:
fun <T> List<T>.containsAny(vararg other : T) =
this.intersect(other.toSet()).isNotEmpty()
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有更好的方法。
我为不同的环境创建了“Django 风格”设置文件。设置文件定义了一些变量,并且还充当其他模块的依赖注入。
所以结构是:
settings/
___init__.py
base.py
dev.py
dev2.py
prod.py
service/
__init__.py
service.py
service_mock.py
Run Code Online (Sandbox Code Playgroud)
我在其中settings/__init__.py
写道:
settings_env = os.environ.get('PROJECT_SETTINGS', '')
if settings_env == 'prod':
from .prod import *
elif settings_env == 'dev':
from .dev import *
Run Code Online (Sandbox Code Playgroud)
每个设置文件定义不同的一些变量,并且还从service.py
或导入一个类service_mock.py
,取决于环境变量。
这基本上工作得很好。
现在的问题是无法service.py
导入设置包,因为设置文件导入了service.py
,这样就会变成循环导入。
正如我在 Django 中看到的,它是通过在设置文件中使用导入字符串而不是实际导入来解决的。我不太喜欢这个想法,因为我失去了一些 IDE 自动完成功能,而且我不确定如何实际创建 Django 提供的设置对象。
解决这个问题的方法有哪些?是否有一个设置文件用作导入模块的依赖项注入容器,并由相同的模块导入?最好是一个简单的解决方案。
我有一个简单的 Angular 组件,在渲染时会抛出以下错误:
MyComponent.html:10 ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked.
Previous value: 'ngForOf: [object Map Iterator]'.
Current value: 'ngForOf: [object Map Iterator]'.
Run Code Online (Sandbox Code Playgroud)
错误会抛出两次,即使移动到没有其他代码的最低限度的 Angular 项目(只是一个 AppComponent 包装这个组件)。
我将代码最小化到仍然重现问题的最小形式。我用硬编码的 observable 替换了数据服务。
MyComponent.html:10 ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked.
Previous value: 'ngForOf: [object Map Iterator]'.
Current value: 'ngForOf: [object Map Iterator]'.
Run Code Online (Sandbox Code Playgroud)
请注意,asyncPipe
在这种情况下使用更常见 - 但我不能使用它。
@Component({
selector: 'my-component',
templateUrl: './my.component.html',
styleUrls: ['./my.component.scss'],
})
export class MyComponent implements OnInit, OnDestroy {
private …
Run Code Online (Sandbox Code Playgroud) 我看到 Kotlin 中扩展函数的一些用法我个人认为这没有意义,但似乎有一些指导方针“显然”支持它(解释问题)。
具体来说:在类之外(但在同一个文件中)定义一个扩展函数:
data class AddressDTO(val state: State,
val zipCode: String,
val city: String,
val streetAddress: String
)
fun AddressDTO.asXyzFormat() = "${streetAddress}\n${city}\n${state.name} $zipCode"
Run Code Online (Sandbox Code Playgroud)
其中asXyzFormat()
被广泛使用,并且不能被定义为专用/内部(也为情况下,可能)。
在我的常识中,如果您拥有代码 ( AddressDTO
) 并且用法不是某个类/模块的本地(因此是私有/内部) - 没有理由定义扩展函数 - 只需将其定义为成员函数班级。
get
-开始的函数序列化- 注释类以获得所需的行为(例如@JsonIgnore
在函数上)。这个恕我直言仍然不能证明扩展功能是合理的。我对此的反驳是,官方 Kotlin 编码约定支持这种方式的扩展功能。具体来说:
自由地使用扩展函数。每次你有一个主要作用于一个对象的函数时,考虑使它成为一个接受该对象作为接收者的扩展函数。 来源
和:
特别是,当为与该类的所有客户端相关的类定义扩展函数时,请将它们放在定义类本身的同一文件中。在定义仅对特定客户端有意义的扩展函数时,将它们放在该客户端的代码旁边。不要创建文件只是为了保存“Foo 的所有扩展名”。 来源
我将感谢任何普遍接受的来源/参考解释为什么将函数移动为类的成员和/或实用参数支持这种分离更有意义。
在进行延迟加载时(UICollectionView表),
为了获得正确的结果,当用户在集合上快速滚动时,您不应该开始下载.
因此,想象一个垂直滚动,每个200个面板都有一个图像; 一次在屏幕上看到四到五个.
首次加载时,前4个可见图像应开始加载.如果向下滚动一点,新的可见图像应该开始加载.
但是如果用户:非常快速地向下滚动到(比方说)位置100,然后定位显示项目100-104的视图......理想情况下,您应该不应该开始加载用户"快速浏览"的图像(例如,通过99),你应该只在用户停止非常快速地滚动时启动下载,并且显然在一些图像上停止或减慢.
因此,在任何高质量的延迟加载卷轴中,这都是您必须要做的标准操作.当用户浏览时,您不会开始加载.
我的问题很简单:SDWebImage是否支持这个概念?如果没有,还有另一种流行的现成方法吗?干杯
我是Kotlin的新手,并尝试将我们现有代码库中的众多Android Util方法之一转换为Kotlin扩展函数.
这是Kotlin代码:
fun Activity?.isAlive(): Boolean {
return !(this?.isFinishing ?: false)
}
Run Code Online (Sandbox Code Playgroud)
这意味着相当于这个Java方法:
public static boolean isAlive(Activity activity) {
return activity != null && !activity.isFinishing();
}
Run Code Online (Sandbox Code Playgroud)
不过,我仍然获得NPEs
在科特林代码每当Activity
为null
.关于我哪里出错的任何想法?
java android kotlin kotlin-android-extensions kotlin-null-safety
拜托,我是Java的新手,我目前正在学习有关Java的教程,但遇到与setText()
方法不仅仅有效有关的错误,我无法告知其不起作用的原因。
这是我尝试的代码:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import java.awt.*;
public class Demo extends Application {
Button button = new Button();
public static void main(String args[])
{
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("This is a title");
button.setText("This is a button");
StackPane stackPane = new StackPane();
stackPane.getChildren().add(button);
Scene scene = new Scene(stackPane,400,400);
primaryStage.setScene(scene);
primaryStage.show();
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误越来越:
Error:(23, 15) java: cannot find symbol
symbol: method setText(java.lang.String)
location: variable button of type java.awt.Button
Run Code Online (Sandbox Code Playgroud) 让我们f()
返回一个可为空的值。
我想做的是,
如果f()
为null,则获取一个空列表,
否则,如果f()
不为null,则获取单个项目的列表value
。
在Scala中,我们可以执行以下操作:
Option(f()).toList
Run Code Online (Sandbox Code Playgroud)
或更详细地
Option(f()).map(v => List(v)).getOrElse(List.empty)
Run Code Online (Sandbox Code Playgroud)
在Kotlin中,没有Option
(假设没有Funktionale库),在Scala中null toList()
与(None: Option
)没有不同。
我们有Elvis运算符,但在listOf()
函数内部将为null ,因此它将为
listOf(f() ?: /* What can I do here? */)
Run Code Online (Sandbox Code Playgroud)
我们想要的null是listOf(/*no argument */)
,但是Elvis运算符需要一个参数,因此listOf(f() ?: )
将导致编译错误。
至少我们可以做
val v = f()
if (v == null) listOf() else listOf(v)
Run Code Online (Sandbox Code Playgroud)
但它是两个衬里。
为此有一些表达吗?
我将在类的主要构造函数默认参数中使用此表达式,因此,如果它不是一个衬里,则将其括在方括号中,因此如下所示:
class A(
val p1: List<V> = run {
val v = f()
if (v == null) listOf() …
Run Code Online (Sandbox Code Playgroud) kotlin ×5
java ×2
android ×1
angular ×1
ios ×1
javafx ×1
lazy-loading ×1
null ×1
option ×1
python ×1
rxjs ×1
sdwebimage ×1
settings ×1
uitableview ×1