Java 1.7与C#List/Set/Map语法糖
本文关键字:Set Map 语法 C#List Java | 更新日期: 2023-09-27 18:00:40
以下内容应该是Java 1.7的一部分:
List<String> list = ["item"];
String item = list[0];
Set<String> set = {"item"};
Map<String, Integer> map = {"key" : 1};
int value = map["key"];
这在C#(和VB.NET)中几乎可以做到,但语法略有不同。在.NET中,这是作为索引属性实现的,这是任何开发人员都可以用来应用于自己的类的语言功能。
有人知道这些特性是否是列表、集合、映射和子类的严格硬编码,或者这背后有一个更通用的语言特性吗?
这两个功能都没有进入JDK7。此处列出了进行切割的Java语言更改:
JSR334:小型语言增强(Project Coin)。一组小的语言更改,旨在简化常见的日常编程任务:switch语句中的字符串、try-with-resources语句、用于创建泛型实例的改进的类型推理("菱形")、简化的varargs方法调用、更好的整数文本和改进的异常处理(多捕获)
剩下的";Project Coin"特性和其他语言更改被推到了JDK8:
JSR294:对模块化编程的语言和虚拟机支持。增强Java语言和虚拟机规范,以在编译时和运行时支持模块化编程
JSR308:Java类型的注释。Java注释语法的扩展,允许对任何类型的出现进行注释
JSR待定:对集合的语言支持。不可变列表、集合、的文字表达式
JSR待定:Lambda项目。Java编程语言的Lambda表达式(非正式地称为"闭包")和defender方法
您指的是Project Coin的两个不同功能,它们被NOT接受包含在JDK 7中。
-
支持集合文字
SomeClass a; SomeClass b; List<SomeClass> list = [a, b]; Map<String, SomeClass> map = { "key1": a, "key2": b }; Set<SomeClass> set = { a, b };
需要注意的是,这些文字只允许创建不可修改的(在.NET中为只读)集合。据我所知,C#中不存在这样的文字(除了数组,但这样的文字在Java中也存在了很长时间)。它也与索引属性无关。
-
列表和地图的索引访问语法
List<SomeClass> l = new ArrayList<>(); SomeClass first = new SomeClass(); l[0] = first; // instead of l.set(0, first); SomeClass retrieved = l[0] // instead of l.get(0); // Similar thing for maps.
这是C#中作为索引属性实现的特性,它只适用于
List
和Map
接口(请记住,与.NET类库相反,Java接口通常不以I
为前缀)——它只不过是编译器对这些方法的调用的转换。
在这两种情况下,都没有通用的语言特征,只有一点语法糖:
- 对于第一个特性,编译器将把文本转换为对几个方法的调用,以创建不可修改的
List
、Set
或Map
。(我似乎记得,返回的具体类甚至不公开。) - 对于第二个特性,只要类实现
List
或Map
接口,编译器就会将表达式转换为对相关方法的调用
他们想在Java中添加一些其他语言(静态/动态)已经具备的功能。映射的初始化方式与一些动态语言相同。