Java 8中“function接口”的精确定义

最近我开始研究Java 8,我不能完全理解Java实现lambdaexpression式所必需的“function接口”的概念。 在Java中有一个非常全面的 lambda函数的指南 ,但是我陷入了定义函数接口概念的章节 。 定义如下: 更确切地说,一个function接口被定义为只有一个抽象方法的任何接口。 然后他继续举例,其中一个是Comparator接口: public interface Comparator { int compare(T o1, T o2); boolean equals(Object obj); } 我能够测试,我可以使用lambda函数来代替Comparator参数,它的工作原理(即Collections.sort(list, (a, b) -> ab) )。 但是在Comparator接口中, compare和equals方法都是抽象的,这意味着它有两个抽象方法 。 那么如果定义需要一个接口只有一个抽象方法 ,那么这怎么可能呢? 我在这里错过了什么?

如何在kotlin中获得多维原始数组类?

在Java中,我一直在使用gson来解析一个像这样[[1.2, 4.1], [3.4, 4.4]] 1.2,4.1 [[1.2, 4.1], [3.4, 4.4]] 3.4,4.4 [[1.2, 4.1], [3.4, 4.4]]的JSON到一个java原始的多数组double[][] 代码看起来像这样(工作正常): String json = “[[1.2, 4.1], [3.4, 4.4]]” double[][] variable = new Gson().fromJson(json, double[][].class); 有没有办法在kotlin中获得double[][].class ? 是double[][] variable; 可以替代kotlin? 编辑: 我的目标是在kotlin中用gson实现同样的行为。 我有一千个双数组解析。 我想在kotlin中做这样的事情: val json = “[[1.1, 1.2], [2.1, 2.2, 2.3], [3.1, 3.2]” val variable:Double[][] = Gson().fromJson(json, Double[][]::class.java)

保持Java中的BaseActivity与Kotlin Activity兼容

我想知道是否有办法维护一个BaseActivity(Java),例如,具有Java和Kotlin活动function的BottomNavigationView。 将来我打算把(几个)Java活动变成Kotlin,因为新的活动是在Kotlin开发的。 问题在于Java能够保持BottomNavigationView正确创建,因为Kotlin扮演的是null,而BottomNavigationView是在Java环境中维护的循环之后加载的。 另一个尝试是尝试将我的Java BaseActivity转换成Kotlin,但打破了各种Java活动的操作。 class KotlinActivity : BaseActivity() { public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_my_wishes_list) ButterKnife.bind(this) //bottomNavigationMenu is null and lost all configurations from the BaseActivity bottomNavigationMenu.menu.getItem(0).isChecked = true } } public class BaseActivity extends AppCompatActivity { @BindView(R.id.bottom_navigation_menu) protected BottomNavigationView bottomNavigationMenu; @Override protected void onPostCreate(@Nullable Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); setupBottomMenu(); } private […]

Kotlin编译错误:未解决的AspectJ超types

我正在尝试在我的Kotlin项目中使用Java库。 在我的项目库中定义的types创建variables工作正常,例如val foo: Foo = fooProvider.get() ,但引入实际使用这些types的代码,例如foo.toString()会导致编译错误: Error:Kotlin: Supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath: class com.example.Foo, unresolved supertypes: ajcMightHaveAspect 从我迄今为止发现的例子中, Footypesimplements了一个AspectJ接口types的ajcMightHaveAspect 。 aspectjrt是在我的类路径,但我找不到在任何地方定义的ajcMightHaveAspect 。 这是一个Kotlin编译器错误? 难道我做错了什么?

如何在kotlin中模拟相同的行为

如何使用lambdas kotlin模拟相同的行为。 Java代码: public interface OnClickListener{ public void onClick(); } public class Sample { OnclickListener mOnclickListener; public void setOnclickListener(OnclickListener l){ if(l!=null) mOnclickListener =l; } public void performClick() { mOnclickListener.onClick(5); } } public class SampleImpl{ Sample sample=new Sample(); sample.setOnClickListener(new OnClickListner(){ onClick{}}); sample.performClick(); } 根据kotlin,函数接收参数的单一方法可以代表在lambda中,我正在尝试… 科特林代码: var sample= Sample(); sample.setOnClickListener({Int -> println(“action performed”) }) sample.performClick(); //will call […]

Kotlin lateinit属性,NPE危险?

我正在使用lateinit属性,以避免连续空检查? 运营商。 我有很多在getViews()函数中首次分配的视图属性。 如果那个函数不在那里,我的应用程序将会从一个KOTlin代码的NPE中崩溃。 在我看来,lateinit属性基本上破坏了语言的漂亮的安全function。 我知道他们是在M13中引入的,因为有更好的框架支持,但是值得吗? 还是我在这里错过了什么? 这里是代码: package com.attilapalfi.exceptional.ui import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.view.View import android.widget.Button import android.widget.ImageView import android.widget.TextView import com.attilapalfi.exceptional.R import com.attilapalfi.exceptional.dependency_injection.Injector import com.attilapalfi.exceptional.model.Exception import com.attilapalfi.exceptional.model.ExceptionType import com.attilapalfi.exceptional.model.Friend import com.attilapalfi.exceptional.persistence.* import com.attilapalfi.exceptional.rest.ExceptionRestConnector import com.attilapalfi.exceptional.ui.helpers.ViewHelper import com.attilapalfi.exceptional.ui.question_views.QuestionYesNoClickListener import com.google.android.gms.maps.MapView import java.math.BigInteger import javax.inject.Inject public class ShowNotificationActivity : AppCompatActivity(), QuestionChangeListener { @Inject lateinit […]

Swift到Kotlin,管理一成不变的名单

我试图移植一个现有的Swift代码给Kotlin,我想使用以下Swift代码的最佳做法: struct Deck { private(set) var cards: [Card] var cardsCount: Int { return self.cards.count } init(cards: [Card] = []) { self.cards = cards } mutating func add(card: Card) { self.cards.append(card) } } 设计目标是: cards属性在类之外是不可修改的,所以它的types应该是List fun add(card: Card)应该修改内部cards列表 有没有一种方法来实现这个Kotlin没有使用两个单独的属性 – 一个private var mutableCards: MutableList和一个计算属性val cards: List get() = this.mutableCards 对于这种情况,我需要一些最佳实践。

jackson@JsonIgnoreProperties多个字段与Kotlin

我无法与kotlin一起使用@JsonIgnoreProperties。 我需要忽略不止一个属性,而且我看到很多教程/ SO问题,在java中,通常你会这样做: @JsonIgnoreProperties({ “p0”, “p1”, “p2” }) class Example(){…} 所以在kotlin这将是: @JsonIgnoreProperties(value = arrayOf( “p0”, “p1”, “p2” )) class Example(){…} JsonIgnoreProperties接口的value字段应该接受数组,因为它是这样声明的: public String[] value() default { }; 但编译器抱怨并希望一个字符串,而不是一个数组。 我甚至不能重复注释,所以我应该如何忽略多个字段? 编辑:似乎是一个kotlin缺少的function,实施自1.2测试版。 可以使用value = [“p0”, “p1”, “p2”]作为注释。 在1.2 beta之前,可以使用@JsonIgnoreProperties(“p0”, “p1”, “p2”) ,没有办法在数组前加上value =

如何从Kotlin的资源中读取文本文件?

我想在Kotlin写一个Spek测试。 测试应从src/test/resources文件夹读取HTML文件。 怎么做? class MySpec : Spek({ describe(“blah blah”) { given(“blah blah”) { var fileContent : String = “” beforeEachTest { // How to read the file file.html in src/test/resources/html fileContent = … } it(“should blah blah”) { … } } } })

Kotlin lambda以Interface作为参数

我对Koltin lambdas有点困惑,我想知道如何使用它,给出以下代码片段: interface KotlinInterface { fun doStuff(str: String): String } 而需要这个接口的函数作为parameter passing: fun kotlinInterfaceAsArgument(kotlinInterface: KotlinInterface): String{ return kotlinInterface.doStuff(“This was passed to Kotlin Interface method”) } fun main(args: Array){ val newString = kotlinInterfaceAsArgument({ str -> str + ” | It’s here” //error here (type mismatch) }) } 但是,Java中的相同逻辑按照预期编译和运行。 public class JavaClass { public String javaInterfaceAsArgument(JavaInterface javaInterface){ […]