小编Lio*_*-On的帖子

对Kotlin的Null Safety感到困惑

我是Kotlin的新手并且已经多次读过Kotlin的Null Safety,但我真的很困惑,并且不清楚.谁能帮我回答下面的问题:

  1. 什么!字符fun getString(key: String!)意味着什么?

  2. 以下运算符的名称是否正确:

?.:安全呼叫运营商

?::猫王运营商

!!:当然是运营商

  1. ?:运营商和?.let?之间有什么区别?我什么时候应该使用每一个?

kotlin kotlin-null-safety

3
推荐指数
1
解决办法
838
查看次数

Kotlin:一种检查列表是否包含另一个Collection / List值的优雅方法?

是否有一种优雅/惯用的方式来检查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)

我只是想知道是否有更好的方法。

kotlin

3
推荐指数
1
解决办法
693
查看次数

项目的 python 设置 - 循环导入/依赖注入

我为不同的环境创建了“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 提供的设置对象。

解决这个问题的方法有哪些?是否有一个设置文件用作导入模块的依赖项注入容器,并由相同的模块导入?最好是一个简单的解决方案。

python settings dependency-injection python-import

3
推荐指数
1
解决办法
1220
查看次数

ExpressionChangedAfterItHasBeenCheckedError:通过迭代地图

我有一个简单的 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)

rxjs angular

3
推荐指数
1
解决办法
441
查看次数

Kotlin:扩展函数的惯用用法 - 将扩展函数放在它扩展的类旁边

我看到 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 的所有扩展名”。 来源

我将感谢任何普遍接受的来源/参考解释为什么将函数移动为类的成员和/或实用参数支持这种分离更有意义。

kotlin extension-function

3
推荐指数
2
解决办法
219
查看次数

SDWebImage是否支持延迟加载时"不用快速滚动"(略读)?

在进行延迟加载时(UICollectionView表),

为了获得正确的结果,当用户在集合上快速滚动时,您不应该开始下载.

因此,想象一个垂直滚动,每个200个面板都有一个图像; 一次在屏幕上看到四到五个.

首次加载时,前4个可见图像应开始加载.如果向下滚动一点,新的可见图像应该开始加载.

但是如果用户:非常快速地向下滚动到(比方说)位置100,然后定位显示项目100-104的视图......理想情况下,您应该不应该开始加载用户"快速浏览"的图像(例如,通过99),你应该只在用户停止非常快速地滚动时启动下载,并且显然在一些图像上停止或减慢.

因此,在任何高质量的延迟加载卷轴中,这都是您必须要做的标准操作.当用户浏览时,您不会开始加载.

我的问题很简单:SDWebImage是否支持这个概念?如果没有,还有另一种流行的现成方法吗?干杯

lazy-loading uitableview ios sdwebimage uicollectionview

2
推荐指数
1
解决办法
472
查看次数

如何在Android Activity上使用Kotlin扩展函数正确执行空检查

我是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在科特林代码每当Activitynull.关于我哪里出错的任何想法?

java android kotlin kotlin-android-extensions kotlin-null-safety

2
推荐指数
1
解决办法
583
查看次数

Java在我的Java代码中出现.setText错误

拜托,我是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)

java javafx

1
推荐指数
1
解决办法
64
查看次数

是否在Kotlin中使用lister()将listOf()设置为null?

让我们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)

null option kotlin kotlin-null-safety

0
推荐指数
1
解决办法
328
查看次数