用函数参数替换重复的代码

我有以下代码,其中包含很多重复.. override fun onOptionsItemSelected(item: MenuItem?): Boolean { when (item?.itemId) { R.id.action_crop -> { val bitmap = capturedReceiptImageView.bitmap val bitmapCropped = BitmapHelper.cropBitmap(bitmap, capturedReceiptImageView.getDimensions()) capturedReceiptImageView.setImageBitmap(bitmapCropped) capturedReceiptImageView.invalidate() bitmap.recycle() } R.id.action_rotate_left -> { val bitmap = capturedReceiptImageView.bitmap val bitmapRotated = BitmapHelper.rotateBitmap(bitmap, -90.0f) capturedReceiptImageView.setImageBitmap(bitmapRotated) capturedReceiptImageView.invalidate() bitmap.recycle() } R.id.action_rotate_right -> { val bitmap = capturedReceiptImageView.bitmap val bitmapRotated = BitmapHelper.rotateBitmap(bitmap, 90.0f) capturedReceiptImageView.setImageBitmap(bitmapRotated) […]

选项链接而不是if / else

有没有更简洁的方式来使用选项链接和/或elvis运算符来编写下面的代码? email.addSubject(if (creator != null) String.format( inviteDescription, creator) else String.format(inviteDescriptionNoCreator, group)) 感觉应该有。

在Kotlin中包含可为空的列表的列表

我有一个List包含空值(我想这是不禁止的)。 如果这个列表中的一个元素为空,我希望整个列表为null(Haskell人们称之为sequence )。 下面的伪代码演示了我想要做的事情: fun sequence(a : List) : List? { return a.fold( listOf(), { prevArray, element -> if(element == null) null else prevArray + element }) } 这是伪代码,因为编译器抱怨Null can not be a value of a non-null type kotlin.collections.List 。 在Kotlin中expression我想要的东西的惯用方式是什么? 使用Java的Optionaltypes,这至少是可编译的: fun sequence(a : List) : Optional<List> { return a.fold( Optional.of(listOf()), { prevArray, element […]

为什么我不能在kotlin中使用lambda接口?

看,我有一个Java类: public final class JavaReceiveSingle { public static void useSingle(Single single) { single.doSth(); } public static void useSingle2(SingleInterface singleInterface) { singleInterface.doSth(); } } 一个Java界面: public interface SingleInterface { void doSth(); } 一个kotlin界面: interface Single { fun doSth() } 现在我可以在一个kotlin类中使用lambda: JavaReceiveSingle.useSingle2({}) 但是如果我想对kotlin接口做同样的事情: JavaReceiveSingle.useSingle({}) IDE将显示错误:必需:单个! 发现:() – >单位 如果我指定单一像: JavaReceiveSingle.useSingle(Single{}) 仍然错误:接口单一没有结构! 尽管下面的代码工作: JavaReceiveSingle.useSingle(object :Single{ override fun aa() […]

注入一个实例Kotlin&Guice失败

我有以下代码: class Test { private val context = Context().apply { property = “foo” } private val injector = Guice.createInjector(Module { it.bind(Context::class.java).toInstance(context) }) @Test fun `service received correct context`() { assertThat(injector.getInstance(Service::class.java).context.property, equalTo(“foo”)) } } class Service @Inject constructor(val context: Context) class Context { @Inject lateinit var property: String } 当运行它时,测试失败,抱怨(正确)一个空字符串不是“foo”。但为什么Guice不使用我精心创建的实例,并以Moduleforms提供给注入器? (这是第一个问题。) 但是,如果我更改Context看起来像这样: class Context { @get:Inject […]

字符串variables插值Java

在Java的字符串建设混淆了我。 我正在做一些事情,比如: url += “u1=” + u1 + “;u2=” + u2 + “;u3=” + u3 + “;u4=” + u4 + “;”; url += “x=” + u1 + “;y=” + u2 + “;z=” + u3 + “;da1=” + u4 + “;”; url += “qty=1;cost=” + orderTotal + “;ord=” + orderId + “?”; 或者,使用StringBuilder,如下所示: url.append(“u1=”); url.append(u1); url.append(“;u2=”); […]

在Kotlin大量转换为Byte

为什么65555转换为byte在Kotlin中产生了19的结果?

HashMap错误 – containsKey,get

任何人都可以点亮一下吗? 问题代码: protected var table = HashMap<Class, Double>() if (table.containsKey(object)) { value = table.get(object) } containsKey(K):不推荐使用布尔值。 Map和Key具有不兼容的types。 上传到任何? 如果你确定的话 所以我改变了这个: if (table.containsKey(object as Any?) 修复了错误,但这是我应该做的修复它吗? 或者,还有更好的方法? 还有.get(object)有一个错误: types推断失败。 要求:kotlin。双重发现kotlin。双重? 同样的错误信息也是这样的: val c = someObject.javaClass // pre j2k code: final Class c = someObject.getClass(); weight = weightingTable[c] <– error here 我不知道在这里做什么

在超类的初始化中使用variables时,重写variables会创建一个NPE

假设我们有以下设置: open class Foo(open val img: Image) { val use = img.graphics } class Bar(override val img: BufferedImage) : Foo(img) 初始化时,使用img.width创建一个NPE。 我认为问题在于,显然即使img直接在Bar的构造函数中传递,当它在Foo中使用时,它并不指向它,而是指向Bar类中的重写variables。 我怎样才能避免这一点?

有可能改变一个实例的动态方法?

我写下了这个代码: open class Test(){ override fun toString(): String { return “This is test!” } } fun createTestX(): Test { return object : Test() { override fun toString(): String { return super.toString() + “XXX” } } } fun main(args: Array) { val x = createTestX() println(x) } 它按预期的方式工作,但我很好奇是否可以使用例如lambda来更改实例的方法,如下所示: val x = Test() x.toString = () -> […]