在Kotlin中编写扩展方法很容易:
class A { }
class B {
fun A.newFunction() { ... }
}
Run Code Online (Sandbox Code Playgroud)
但有没有办法创建扩展变量?喜欢:
class B {
var A.someCounter: Int = 0
}
Run Code Online (Sandbox Code Playgroud) 请告诉我,这个例子中是否存在任何差异(就Java而言):
object DefaultValues {
val FILES_TO_DOWNLOAD = 100
}
Run Code Online (Sandbox Code Playgroud)
和
class DefaultValues {
companion object {
val FILES_TO_DOWNLOAD = 100
}
}
Run Code Online (Sandbox Code Playgroud)没有类或对象包装器:
const val DEFAULT_FILES_TO_DOWNLOAD = 100
Run Code Online (Sandbox Code Playgroud)
和
val DEFAULT_FILES_TO_DOWNLOAD = 100
Run Code Online (Sandbox Code Playgroud)定义的真正方法是什么?:
public static final int FILES_TO_DOWNLOAD = 100
Run Code Online (Sandbox Code Playgroud) 是否有一种简单的方法可以将列表分成Kotlin中的部分(可能是一些lambda)?
例如:
[1, 2, 3, 4, 5, 6] => [[1, 2], [3, 4], [5, 6]]
Run Code Online (Sandbox Code Playgroud) 我已经创建了计算字母表中每个字符的方法.我正在学习流(函数式编程)并尝试尽可能多地使用它们,但在这种情况下我不知道该怎么做:
private Map<Character, Integer> numerateAlphabet(List<Character> alphabet) {
Map<Character, Integer> m = new HashMap<>();
for (int i = 0; i < alphabet.size(); i++)
m.put(alphabet.get(i), i);
return m;
}
Run Code Online (Sandbox Code Playgroud)
那么,如何使用Java 8流重写它呢?
使用Java原语,可以很容易地将char代码转换为符号
int i = 65;
char c = (char) i; // 'A'
Run Code Online (Sandbox Code Playgroud)
如何与Kotlin一样?
limitJava 8中有一个stream方法:
package com.concretepage.util.stream;
import java.util.Arrays;
import java.util.List;
public class LimitDemo {
public static void main(String[] args) {
List<String> list = Arrays.asList("AA","BB","CC","DD","EE");
list.stream().limit(3).forEach(s->System.out.println(s));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
AA
BB
CC
Run Code Online (Sandbox Code Playgroud)
Kotlin中的模拟名称是什么,或者如何通过其他方式更好地做到这一点?
例:
// Java
System.out.println("one;two;th/;ree".split("(?<!/);").length); // 3
// Kotlin
println("one;two;th/;ree".split("(?<!/);").size) // 1
Run Code Online (Sandbox Code Playgroud)
怎么纠正这个?
假设我们编写了一个测试系统.测试包含任务列表,每个任务包含问题和答案列表.我们还假设问题或答案不仅可以是文本,还可以是图像.所以我们使用泛型:
public interface IQuestion<T>
{
T Content { get; }
}
public interface IAnswer<T>
{
T Content { get; }
bool IsCorrect { get; }
}
Run Code Online (Sandbox Code Playgroud)
当我们创建任务时会出现问题:
interface ITask<TQuestion, TAnswer>
{
TQuestion Question { get; }
List<TAnswer> Answers { get; }
}
Run Code Online (Sandbox Code Playgroud)
怎么写TQuestion应该是子类型IQuestion和TAnswer- 子类型IAnswer?
我试过了:
interface ITask<TQuestion, TAnswer>
where TQuestion : IQuestion<object>
where TAnswer : IAnswer<object>
Run Code Online (Sandbox Code Playgroud)
但是当我创建时:
class TextQuestion : IQuestion<string> {...}
class TextAnswer : IAnswer<string> {...}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
class TextTask : ITask<TextQuestion, …Run Code Online (Sandbox Code Playgroud) 我有一个函数,过滤一些值的列表,它使用instanseof构造:
public static List<View> getAllChildren(View v) {
/* ... */
if (v instanceof Button) {
resultList.add(v);
}
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
我想让它更通用,并将Button设置为函数参数:
public static List<View> getAllChildren(View v, ? myClass) {
/* ... */
if (v instanceof myClass) {
resultList.add(v);
}
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将myClass传递给函数.请告诉我如何概括这个功能?
我做过这样的事情:
List<String> strList = asList("getElementById", "htmlSpecialChars", "httpRequest");
String maxOfLowercase = strList.stream()
.max((o1, o2) -> {
long lowerCount1 = o1.chars().filter(Character::isLowerCase).count();
long lowerCount2 = o2.chars().filter(Character::isLowerCase).count();
return Long.compare(lowerCount1, lowerCount2);
}).get();
Run Code Online (Sandbox Code Playgroud)
但我认为有可能让这更容易\射手,不是吗?