标签: kotlin

在Kotlin中按多个字段对集合进行排序

假设我有一个人员列表,我需要按年龄排序,然后按姓名排序.

来自C#-background,我可以使用LINQ轻松实现所述语言:

var list=new List<Person>();
list.Add(new Person(25, "Tom"));
list.Add(new Person(25, "Dave"));
list.Add(new Person(20, "Kate"));
list.Add(new Person(20, "Alice"));

//will produce: Alice, Kate, Dave, Tom
var sortedList=list.OrderBy(person => person.Age).ThenBy(person => person.Name).ToList(); 
Run Code Online (Sandbox Code Playgroud)

如何使用Kotlin实现这一目标?

这是我尝试过的(显然是错误的,因为第一个"sortedBy"子句的输出被第二个被覆盖,导致列表仅按名称排序)

val sortedList = ArrayList(list.sortedBy { it.age }.sortedBy { it.name })) //wrong
Run Code Online (Sandbox Code Playgroud)

kotlin

187
推荐指数
2
解决办法
7万
查看次数

现在 Handler() 已被弃用,我该使用什么?

如何修复此代码中的弃用警告?或者,还有其他选择吗?

Handler().postDelayed({
    context?.let {
        //code
    }
}, 3000)
Run Code Online (Sandbox Code Playgroud)

java android kotlin android-handler

184
推荐指数
12
解决办法
7万
查看次数

Kotlin的名单缺少"添加","删除"等?

在Java中,我们可以执行以下操作

public class TempClass {
    List<Integer> myList = null;
    void doSomething() {
        myList = new ArrayList<>();
        myList.add(10);
        myList.remove(10);
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果我们直接将其重写为Kotlin,如下所示

class TempClass {
    var myList: List<Int>? = null
    fun doSomething() {
        myList = ArrayList<Int>()
        myList!!.add(10)
        myList!!.remove(10)
    }
}
Run Code Online (Sandbox Code Playgroud)

我从我的列表中得到了没有找到addremove运行的错误

我努力将它转换为ArrayList,但这需要投射它是奇怪的,而在Java中不需要.这就违背了抽象类List的目的

class TempClass {
    var myList: List<Int>? = null
    fun doSomething() {
        myList = ArrayList<Int>()
        (myList!! as ArrayList).add(10)
        (myList!! as ArrayList).remove(10)
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让我使用List但不需要投射它,就像在Java中可以做到的那样?

collections kotlin

178
推荐指数
7
解决办法
10万
查看次数

onBackPressed() 已弃用。还有什么选择呢?

我已经升级到targetSdkVersion和。compileSdkVersion33

我现在收到一条警告,告诉我onBackPressed已被弃用。

我看到建议使用android.window.OnBackInvokedCallbackandroidx.activity.OnBackPressedCallback来处理后退导航。任何人都可以帮助我使用更新的方法吗?

例子

onBackPressed已弃用

使用案例

我在onBackPressed()if (isTaskRoot) {}方法内部使用来检查该活动是否是活动堆栈上的最后一个活动。

override fun onBackPressed() {
    if (isTaskRoot) { // Check whether this activity is last on the activity stack. (Check whether this activity opened from a Push Notification.)
        startActivity(Intent(mContext, Dashboard::class.java))
        finish()
    } else {
        finishWithResultOK()
    }
}
Run Code Online (Sandbox Code Playgroud)

navigation android kotlin deprecation-warning android-tiramisu

178
推荐指数
9
解决办法
11万
查看次数

如何使“不适当的阻塞方法调用”合适?

我目前正在尝试更多地利用 kotlin 协程。但我面临一个问题:在这些协程中使用 moshi 或 okhttp 时,我收到警告:

“不适当的阻塞方法调用”

解决这些问题的最佳方法是什么?我真的不想不合适;-)

kotlin okhttp moshi kotlin-coroutines

172
推荐指数
6
解决办法
5万
查看次数

标准Kotlin库中提供了哪些Java 8 Stream.collect等价物?

在Java 8中,Stream.collect允许对集合进行聚合.在Kotlin中,除了作为stdlib中的扩展函数的集合之外,它不以相同的方式存在.但目前尚不清楚不同用例的等价性.

例如,在JavaDocCollectors顶部是为Java 8编写的示例,当将它们移植到Kolin时,在不同的JDK版本上不能使用Java 8类,因此它们应该以不同的方式编写.

在网上显示Kotlin集合示例的资源方面,它们通常是微不足道的,并没有真正与相同的用例进行比较.什么是真正符合Java 8记录的案例的好例子Stream.collect?那里的清单是:

  • 将名称累积到列表中
  • 将名称累积到TreeSet中
  • 将元素转换为字符串并将它们连接起来,用逗号分隔
  • 计算员工工资的总和
  • 按部门分组员工
  • 按部门计算工资总额
  • 将学生分成传球和失败

以上链接的JavaDoc中的详细信息.

注意: 这个问题是由作者故意编写和回答的(答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.

java collections java-8 kotlin java-stream

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

您的项目需要更新版本的 Kotlin Gradle 插件。(安卓工作室)

我刚刚将我的 flutter 项目包更新为空安全兼容,现在 Android Studio 希望我更新我的项目以使用最新版本的 Kodling Gradle 插件。但看不出在哪里可以改变这一点。我尝试过改变,"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"但这"org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.10"没有效果。

我的build.grade文件如下所示:

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) …
Run Code Online (Sandbox Code Playgroud)

kotlin android-studio flutter gradle-kotlin-dsl

170
推荐指数
9
解决办法
23万
查看次数

如何获取具有已知资源名称的资源ID?

我想通过名称而不是其int id访问像String或Drawable这样的资源.

我会用哪种方法?

java android kotlin android-resources

168
推荐指数
7
解决办法
19万
查看次数

kotlin字符串模板中的格式

Kotlin有一个很棒的功能叫做字符串模板.我真的很喜欢它.

 val i = 10 
 val s = "i = $i" // evaluates to "i = 10"
Run Code Online (Sandbox Code Playgroud)

但是模板中是否可以有任何格式?例如,我想在kotlin中格式化字符串模板中的Double,至少在小数分隔符后设置一些数字:

val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?
Run Code Online (Sandbox Code Playgroud)

string-formatting kotlin

166
推荐指数
5
解决办法
10万
查看次数

升级到Android 8.1后,startForeground失败

将手机升级到8.1开发人员预览后,我的后台服务不再正常启动.

在我长期运行的服务中,我实现了一个startForeground方法来启动正在进行的通知,该通知在create上调用.

    @TargetApi(Build.VERSION_CODES.O)
private fun startForeground() {
    // Safe call, handled by compat lib.
    val notificationBuilder = NotificationCompat.Builder(this, DEFAULT_CHANNEL_ID)

    val notification = notificationBuilder.setOngoing(true)
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .build()
    startForeground(101, notification)
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

11-28 11:47:53.349 24704-24704/$PACKAGE_NAMEE/AndroidRuntime: FATAL EXCEPTION: main
    Process: $PACKAGE_NAME, PID: 24704
    android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=My channel pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x42 color=0x00000000 vis=PRIVATE)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1768)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Run Code Online (Sandbox Code Playgroud)

服务通知的通道无效,显然我的旧通道DEFAULT_CHANNEL_ID不再适用于我假设的API 27.什么是合适的渠道?我试图浏览一下文档

service android background-service android-notifications kotlin

159
推荐指数
6
解决办法
8万
查看次数