假设我有一个人员列表,我需要按年龄排序,然后按姓名排序.
来自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) 如何修复此代码中的弃用警告?或者,还有其他选择吗?
Handler().postDelayed({
context?.let {
//code
}
}, 3000)
Run Code Online (Sandbox Code Playgroud) 在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)
我从我的列表中得到了没有找到add并remove运行的错误
我努力将它转换为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中可以做到的那样?
我已经升级到targetSdkVersion和。compileSdkVersion33
我现在收到一条警告,告诉我onBackPressed已被弃用。
我看到建议使用android.window.OnBackInvokedCallback或androidx.activity.OnBackPressedCallback来处理后退导航。任何人都可以帮助我使用更新的方法吗?
我在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
我目前正在尝试更多地利用 kotlin 协程。但我面临一个问题:在这些协程中使用 moshi 或 okhttp 时,我收到警告:
“不适当的阻塞方法调用”
解决这些问题的最佳方法是什么?我真的不想不合适;-)
在Java 8中,Stream.collect允许对集合进行聚合.在Kotlin中,除了作为stdlib中的扩展函数的集合之外,它不以相同的方式存在.但目前尚不清楚不同用例的等价性.
例如,在JavaDocCollectors的顶部是为Java 8编写的示例,当将它们移植到Kolin时,在不同的JDK版本上不能使用Java 8类,因此它们应该以不同的方式编写.
在网上显示Kotlin集合示例的资源方面,它们通常是微不足道的,并没有真正与相同的用例进行比较.什么是真正符合Java 8记录的案例的好例子Stream.collect?那里的清单是:
以上链接的JavaDoc中的详细信息.
注意: 这个问题是由作者故意编写和回答的(自答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.
我刚刚将我的 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) 我想通过名称而不是其int id访问像String或Drawable这样的资源.
我会用哪种方法?
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) 将手机升级到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
kotlin ×10
android ×4
java ×3
collections ×2
flutter ×1
java-8 ×1
java-stream ×1
moshi ×1
navigation ×1
okhttp ×1
service ×1