Tag: 集合

什么是深刻复制二维MutableList简洁的方式?

元素已经实现了深度复制。 fun <T : DeepCopiable> f(a: MutableList<MutableList<T>>) { val copied = a.map { it.map { it.deepCopy() }.toMutableList() }.toMutableList() … } 我正在使用这种代码,但似乎冗长。

Set中的重复项

在Kotlin中,我有一个数据类的MutableSet 。 数据类不会覆盖equals()或hashCode() 。 我一直在遇到涉及集合中重复对象的错误,并且我注意到调用foo.containsAll(foo)为该集合返回false 。 我经历了集合中的每个项目,只有少数返回false为foo.contains(foo.toList()[i]) 。 对于那些,调用foo.toList()[i] == foo.toList()[i]返回true 。 所以,平等检查工作。 这里发生了什么?

使用一个对象来实现一个空List的错误

我试图重写列表接口作为学习功能编程Kotlin的练习,但我无法弄清楚为什么我得到一个错误,当我试图让一个对象作为空的列表,在Kotlin标准库中不会发生。 在我的代码中,见下面,我想使用NIL作为单例空列表,使用list()作为函数返回它。 但是,这会在类型为“必需列表”的函数上生成类型不匹配错误。找到NIL“ interface List<A> { val empty: Boolean val head: A val tail: List<A> fun cons(a: A): List<A> = Cons(a, this) } object NIL : List<Nothing> { override val empty: Boolean = true override val head: Nothing get() = throw IllegalStateException("head called on empty list") override val tail: List<Nothing> get() = throw IllegalStateException("tail called […]

从LinkedHashMap中提取映射值作为ArrayList

我创建了一个简单的类MapExtension来容纳将4个值传递给一个listview适配器,并使用LinkedHashmap来添加MapExtension的ArrayList。 public class MapExtension { private String studname; private String studnumber; private String schedule; public MapExtension(String studname, String studnumber, String schedule) { this.studname = studname; this.studnumber= studnumber; this.schedule= schedule; } public String getStudname () { return studname; } public String getStudnumber() { return studnumber; } public String getSchedule() { return schedule; } } 每当我尝试从LinkedHashMap中提取返回Collections的ArrayList<MapExtension> ,我会从不同的试验中得到这些错误(在注释中): […]

为什么Stream.flatMap不能接受集合?

给出以下作为数据类的例子: class Country { List<Region> regions = new ArrayList<>(); List<Region> getRegions() { return regions; } } class Region { String getName() { return "some name"; } } 假设我会有一个国家名单 List<Country> countries = new ArrayList<>(); 我想把这些流到他们的地区和他们相应的名字,我想做以下事情: countries.stream().flatMap(Country::getRegions).map(Region::getName)… 但是,由于“getRegions”的返回值是Collection(List),而不是由FlatMap方法接受的Stream,所以该代码不能编译。 但是因为我知道任何Collection都可以通过它的Collection.stream()方法进行流式处理,这应该不是问题。 我仍然被迫写下如下: countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)… 哪个(给予更丰富的上下文)比前者更不可读。 问题是,有什么原因,我错过了,因为这是庞大的? 在我的框架中,我有很多的例子,我不得不采取这种方式,总是让我酸酸的味道。 (猜猜我只需要将Kotlin添加到我们的项目中,并使用带有Collection:p或do的flatMap方法来扩展Stream类)

从ArrayList中删除偶数

我必须创建一个具有ArrayList的方法; 我需要从这个ArrayList中删除偶数。 我已经写了代码,但有一个逻辑错误,我无法识别。 这是我的代码: static void sortList(){ List <Integer> number=new ArrayList <Integer>(); number.add(11); number.add(45); number.add(12); number.add(32); number.add(36); System.out.println("Unsorted List: "+number); for (int i=0;i<number.size();i++){ int even=number.get(i)%2; if (even==0){ System.out.println("This is Even Number:"+ number.get(i)); number.remove(i); } } Collections.sort(number); System.out.println("Sorted List: "+number); } 代码的输出是: Unsorted List: [11, 45, 12, 32, 36] This is Even Number:12 This is Even […]

Java 9集合的便利工厂方法作为集合文字的替代方法

考虑这种方法(只是为了说明): boolean isSmallNumber(String s) { return (n in ["one", "two", "three", "four"]); } 当然,这不是Java ,但它可能是你最喜欢的替代语言,支持集合文字,如Groovy或Kotlin 。 表达式是简洁的,就像字符串文字一样,编译器可以将集合文字放在某个静态存储区(甚至可能是"intern()" )。 现在输入Java 9 : boolean isSmallNumber(String s) { return Set.of("one", "two", "three", "four").contains(s); } 这也是简洁的,但不幸的是,每次调用它时,都会在堆上分配一个新的Set,然后立即使其可用于垃圾回收。 当然,您可以定义一个收集常量: private static final Set<String> SMALL_NUMBERS = Set.of(…); 但是这个定义可能与一个大类中的方法定义有一千多的距离,并且你可能无法为它考虑一个好的描述性名称,而字面可能更清楚(在这个假设的情况下)。 所以,如果我在方法内部使用Set.of(…) , JIT编译器会在每次调用方法时优化创建新对象吗?

“Null-Safe”收集语言

免责声明:如果你有更好的标题或标签,请编辑这个问题 在编译时有一些Kotlin语言提供了Null安全性。 如果变量在初始化之前被读取,编译器将会抛出语法错误。 有没有一种语言,可以在编译时确保集合在集合中访问该值之前将包含某个值(由整数索引或任意ID标识)? 有没有一个正式的语言处理这个? 例1 val list = ArrayList<String>() val obj: String = list.get(0) // –> syntax error (x is empty at this point) 例2 val map = HashMap<String, String>() map.put("key1", "test") val obj: String = map.get("key2") // –> syntax error (Key2 is not in the map)

编译为Javascript时使用Kotlin的Java标准库

我在Kotlin中实现了一个在浏览器中使用的库。 当我将其编译为Javascript时,找不到Java标准lib的依赖项,例如像PriorityQueue这样的集合类。 是否有可能说服编译器查找和编译这些类,或者是否有预编译的Javascript-Java标准库,还是只能使用Kotlin标准库?

如何将一个集合的内容添加到新的集合

我试图覆盖调用超类的方法,并将返回的值添加到一个新的集合(这是必需的,因为超类的返回值是不可变的)。 这个习惯性的Java如下所示: public class JaxrsApplication extends Application { @Override public Set<Class<?>> getClasses() { HashSet<Class<?>> classes = new HashSet<>(super.getClasses()); classes.add(PlainTextWriter.class); classes.add(PageResource.class); return classes; } } 我试图在Kotlin中实现一个相当于没有成功的方法: public class JaxrsApplication() : Application() { override fun getClasses(): MutableSet<Class<out Any?>>? { val classes = hashSetOf<Class<out Any?>>() classes.addAll(super.getClasses()) // <= compiler error! classes.add(javaClass<PlainTextWriter>()) classes.add(javaClass<PageResource>()) return classes } } 这似乎是对addAll函数的类型推断问题,但我不知道如何解决它。 帮助赞赏:-) […]