Java 为什么要收集文本?

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" }; 列出水果=[“苹

从关于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" }; 
列出水果=[“苹果”、“芒果”、“番石榴”];
套花={“玫瑰”、“雏菊”、“菊花”};
印地语地图={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"] } 
        };