当前位置: 首页 > 科技观察

在Java和Groovy中创建和初始化列表的区别

时间:2023-03-13 23:10:37 科技观察

我真的很喜欢Groovy编程语言。我喜欢它是因为我喜欢Java,尽管Java有时会让人感到笨拙。因为我太爱Java了,其他运行在JVM上的语言对我没有吸引力。例如,Kotlin、Scala和Clojure等语言给人的感觉与Java不同,因为它们对什么是好的编程语言有不同的理解。Groovy不像他们,在我看来,Groovy是一个完美的选择,特别是对于那些喜欢Java,但需要一种更灵活、紧凑、有时更直接的语言的程序员。列表数据结构就是一个很好的例子。它可以包含一个无序列表。列表中的元素可以是数字、字符串或对象。程序员可以通过某种方式高效地遍历这些元素,尤其是对于那些编写和维护脚本的人来说,“效率”的关键是要有简洁明了的表达方式,不要有很多模糊代码意图的“仪式”。安装Java和GroovyGroovy是基于Java的,所以需要同时安装一个Java。您的Linux发行版的存储库中可能有最新的Java好版本。或者,您可以按照这些说明安装Groovy。对于Linux用户,SDKMan是一个很好的选择,您可以使用它来获得多个Java和Groovy版本,以及许多其他相关工具。对于本文,我使用的SDK发行版是:Java:OpenJDK11,版本11.0.12-openGroovy:版本3.0.8言归正传,Java中有很多方法可以实例化和初始化一个列表,从它的开始原始介绍曾经有一段时间(我认为是在Java1.5左右,但请不要引用我的话)。在这些方法中,有两个有趣的方法涉及类java.util.Arrays和java.util.List。使用java.util.Arrays类java.util.Arrays类定义了一个asList()静态方法,可用于创建基于数组的列表,因此其大小是不可变的,尽管其中的元素是可以修改的。用法如下:vara1=Arrays.asList(1,2,3,4,5,6,7,8,9,10);//可变元素的不可变列表System.out.println("a1="+a1);System.out.println("a1isaninstanceof"+a1.getClass());//输出是//a1=[1,2,3,4,5,6,7,8,9,10]//a1是类java.util.Arrays$ArrayLista1.set(0,0)的实例;//成功System.out.println("a1="+a1);//输出是//a1=[0,2,3,4,5,6,7,8,9,10]a1.add(11);//生成失败//线程“main”中的异常java.lang.UnsupportedOperationExceptionSystem.out。println("a1="+a1);//notreachedusingthejava.util.List类java.util.List类定义了一个静态方法of(),可用于创建一个不可变列表,其元素是可变的,具体取决于它们本身是否支持修改。用法如下:vara2=List.of(1,2,3,4,5,6,7,8,9,10);System.out.println("a2="+a2);System.out.println("a2isaninstanceof"+a2.getClass());//输出为//a2=[1,2,3,4,5,6,7,8,9,10]//a2是类java.util.ImmutableCollections$ListNa2.set(0,0)的实例;//产生失败//线程“main”中的异常java.lang.UnsupportedOperationExceptionSystem.out.println("a2="+a2);//未达到da2.add(11);//如果以上两行被注释掉,也会因为同样的原因而失败outSystem.out.println("a2="+a2);//未达到所以,我可以使用Arrays.asList(),也可以使用List.of()方法,如果我想要的是一个大小不能改变且不关心元素是否存在的列表可变的。如果我想初始化一个可变列表,我更喜欢将不可变列表作为参数传递给列表构造函数,如下所示:vara1=newArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));System.out.println("a1="+a1);System.out.println("a1是"的一个实例+a1.getClass());//输出is//a1=[1,2,3,4,5,6,7,8,9,10]//a1是类java.util.ArrayLista1.set(0,0);System.out的实例.println("a1="+a1);//输出为//a1=[0,2,3,4,5,6,7,8,9,10]a1。add(11);System.out.println("a1="+a1);//输出是//a1=[0,2,3,4,5,6,7,8,9,10,11]请注意,这个Arrays.asList()方法用于初始化这个新的ArrayList(),也就是说,它创建传入列表的可变副本。现在,也许它只是我,但这种方法似乎确实需要了解有关java.util.Arrays和java.util.List类的很多细节,我只想创建并初始化一个数字列表(尽管有在实际使用的声明中并没有太多的“仪式”)。下面是实际使用的这行代码,仅供参考:vara1=newArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));Groovy怎么做让我们看看如何在Groovy中实现上述要求:defa1=[1,2,3,4,5,6,7,8,9,10]println"a1=$a1"println"a1is${a1.getClass()}"的实例//输出是//a1=[1,2,3,4,5,6,7,8,9,10]//a1是类java的实例.util.ArrayLista1[0]=0println"a1=$a1"//输出是//a1=[0,2,3,4,5,6,7,8,9,10]a1<<11println"a1=$a1"//输出是//a1=[0,2,3,4,5,6,7,8,9,10,11]我们一眼就可以看出Groovy使用了def关键字而不是var关键字。我还发现,只需将类型列表(在本例中为整数)放在括号中,我就可以创建一个列表。此外,结果列表正是我想要的:一个可变的ArrayList实例。现在,再一次,也许只有我一个人,但上面的代码看起来简单得多——不记得.of()和.asList()返回“半不变半可变”结果,并且没有必要这样做给他们一些补偿。作为额外的好处,我现在可以使用括号和下标来引用列表中的特定元素,而不是调用set()方法。另外,列表后面的<<运算符也很方便,我再也不用调用add()方法来添加元素了。另外,您是否注意到代码中没有分号?是的,在Groovy中,句子末尾的分号不是必需的。最后再来看看字符串插值,只要在字符串中使用$变量或者${expression}就可以实现!在Groovy世界中还有很多“有待发现”。上面的列表定义实际上是动态类型(Groovy中的默认值)和Java中的静态类型之间的比较。在上面Groovy代码中定义的行中,变量a1的类型是在运行时根据对等号右侧表达式的求值推断出来的。现在我们都知道动态语言可以给我们带来强大的功能,有了强大的功能,我们就有很多尝试不同事物的机会。对于那些不喜欢动态类型的程序员,Groovy也支持静态类型。Groovy相关资源ApacheGroovy网站有大量文档。另一个很棒的Groovy资源是Haki先生。学习Groovy的另一个重要原因是您可以继续学习Grails,它是一个优秀且高效的全栈Web框架,构建在许多优秀的组件之上,例如Hibernate、SpringBoot和Micronaut等。