Java 为什么要收集文本?
从关于Java 7的各种在线文章中,我了解到Java 7将具有如下集合文字1:Java 为什么要收集文本?,java,collections,java-7,Java,Collections,Java 7,从关于Java 7的各种在线文章中,我了解到Java 7将具有如下集合文字1: List<String> fruits = [ "Apple", "Mango", "Guava" ]; Set<String> flowers = { "Rose", "Daisy", "Chrysanthemum" }; Map<Integer, String> hindiNums = { 1 : "Ek", 2 : "Do", 3 : "Teen" }; 列出水果=[“苹
List<String> fruits = [ "Apple", "Mango", "Guava" ];
Set<String> flowers = { "Rose", "Daisy", "Chrysanthemum" };
Map<Integer, String> hindiNums = { 1 : "Ek", 2 : "Do", 3 : "Teen" };
列出水果=[“苹果”、“芒果”、“番石榴”];
套花={“玫瑰”、“雏菊”、“菊花”};
印地语地图={1:“Ek”,2:“Do”,3:“Teen”};
我的问题是:
,
,可以如下使用:List fruits=ArrayList.of(“苹果”、“芒果”、“番石榴”)代码>
依我看,这看起来和字面版本一样好,而且相当简洁。那么,他们为什么要发明一种新的语法(EDIT:所说的“新”是指“Java新技术”)
当我说列出水果=[“苹果”,“芒果”,“番石榴]代码>我实际会得到什么列表
?是ArrayList
还是LinkedList
还是其他什么
1正如注释中所指出的,集合文本并没有成为Java7的切入点,事实上Java8也是如此。(这是一份来自Oracle开发人员Brian Goetz的报告,总结了不包含此功能的理由;这是报告本身。)只是为了澄清一点,他们并没有“发明新语法”
我不是100%确定最初的想法来自哪里,但是在Perl中使用“[]”表示列表,“{}”表示映射是存在的(在构建数组引用和散列引用时使用)
严格来说,perl中没有“set”,但set最惯用的实现是map(将set成员映射到1),因此“{}”也适用
因此Perl会说与您列出的内容完全相同的内容:
$fruits = [ "Apple", "Mango", "Guava" ]; # Creates array reference
$flowers = { "Rose" => 1, "Daisy" => 1, "Chrysanthemum" => 1 };
# or { map {$_=>1} ("Rose", "Daisy", "Chrysanthemum"))
$hindiNums = { 1 => "Ek", 2 => "Do", 3 => "Teen" };
当然,我并不是说上述内容来自Perl,但它至少与另一种语言一致,因此可能具有更广泛的用途。语言设计是一个品味问题。尽管如此,这种列表/对象初始化已经变得非常流行。例如,C#有几乎相同的东西。语法非常灵活,并且,正如您的示例所示,允许您初始化类似于内联字典的内容。我很喜欢设计师在这里选择的语法 这并不是一种全新的语法,因为Python、Javascript(json)和其他语言中都有这种文本
<>我还没有看到任何关于java 7的信息,但坦白地说,(最近我们把注意力放在C++和JavaScript上),但是实际上看到这样一个语言的添加是很好的。 注意的是,对于列表来说,使用VAR-ARGS非常容易,但是有点想一下你是如何为地图做这件事的。除非引入一个额外的Map.Entry对象或类似的东西,否则无法向var args方法提供成对的参数
因此,使用现有的语法,您将得到
Map<String,String> map = HashMap.of( new Entry( "key1", "value1" ),
new Entry( "key2", "value2" ) );
Map Map=HashMap.of(新条目(“key1”、“value1”),
新条目(“键2”、“值2”);
这会很快变得很累
即使您使用构建器模式(正如我们所做的那样),那么它也非常丑陋
Map<String,String> map = CollectionUtil.<String,String>map()
.put( "key1", "value1" )
.put( "key2", "value2" )
.map();
Map Map=CollectionUtil.Map()
.put(“键1”、“值1”)
.put(“键2”、“值2”)
.map();
他们可能受到了的声明式编程风格的启发。然而,如果是这样的话,我很失望他们没有尽全力支持对象文字。以下是JavaFX中对象文字的示例:
Stage {
title: "Group-Nodes-Transformation"
scene: Scene {
width: 600
height: 600
content: Group {
content: [
Circle {
centerX: 300
centerY: 300
radius: 250
fill: Color.WHITE
stroke: Color.BLACK
},
Text {
x: 300
y: 300
content: "Mr. Duke"
},
ImageView {
image: Image {
url: "D:\\TEST\\Documents\\duke.png"
width:50
height:50
}
}
]
}
}
}
我认为这种编程风格肯定适合某些应用领域。归根结底,这总是一个品味的问题……在我看来,这只是一个简化了一点代码的例子。为什么你对同一种糖不感到惊讶:
int []arr1 = new int[] {1,2,3};
int []arr2 = {1,2,3};
这只是一种表达简单想法的便捷方式,而不是像这样写东西
int []arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
这会给我们的生活增添新的东西吗?不,这能让我们的生活轻松一点吗?我想是的
关于问题的第二部分,我不知道实际的类型是什么。但坦率地说,您多久关心一次集合实现是什么?特别是考虑到这样的集合相对较小(所有值都由开发人员键入)。不管怎么说,在那些罕见的情况下,如果你真的在意,就不要使用这种简化的语法,而是自己做这项工作。你是对的,这只是空洞的语法糖
另外,您的(…)数组列表
只是新数组列表(Arrays.asList(…)对问题2的回答:
final List<Integer> piDigits = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9];
final List piDigits=[3,1,4,1,5,9,2,6,5,3,5,9];
给你一个不变的列表
这个建议的全部思想是不能指定子类型。编译器根据右侧的集合选择合适的实现
请阅读此处的详细信息:
对问题1的回答:是的。这是一个风格问题。我认为原因之一是,(…)的
将生成一个未经检查的警告,如果您试图用泛型对象的实例填充它
原因是,…
扩展为java数组,java数组不喜欢泛型实例
以下是规范中处理此特定问题的示例:
List<List<Integer>> pascalsTriangle =
[[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1]]
List pascalsTriangle=
[[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1]]
目前无法以这种简洁的方式初始化此变量,也无法避免未选中的警告。A1是的,这是可能的,但需要您键入越来越多的内容
虽然这并不是本质上的错误,但这是开发人员抱怨最多的问题之一。他们(有时我自己也会)感觉到Java
随着硬件速度的提高,新的编程语言开始变得可行,这些语言在开始时过于昂贵,无法执行计算
/**
* Analog to put( Object k, Object v );
*/
public [( Object = k )]=( Object v ) {
}
Map map = ....
map.["name"]="Oscar";
map.put("name","Oscar");
int million = 1_000_000;
new Stage() {{
title = "Group-Nodes-Transformation";
scene = new Scene() {{
width = 600;
height = 600;
content = new Group() {{
content = new Object[] = {
new Circle() {{
centerX = 300;
centerY = 300;
radius = 250;
fill = Color.WHITE;
stroke = Color.BLACK;
}},
new Text() {{
x = 300;
y = 300;
content = "Mr. Duke";
}},
new ImageView() {{
image = new Image() {{
url = "D:\\TEST\\Documents\\duke.png"
width = 50;
height = 50;
}};
}};
};
}};
}};
}};
// Currency devisions by country, and their various names
Map<String,Map<Float,List<String>>> CURRENCIES =
{ "US" : { 1 : ["dollar","buck"],
0.25 : ["quarter"],
0.10 : ["dime"],
0.05 : ["nickel"],
0.01 : ["penny"] },
"UK" : { 1 : ["pound"],
1.05 ["guinea"],
0.125 : ["half crown"],
0.05 : ["shilling","bob"],
0.025 : ["sixpence"] }
};