Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:像C一样的通用键值#_Java_C#_Arrays_Hashmap - Fatal编程技术网

Java:像C一样的通用键值#

Java:像C一样的通用键值#,java,c#,arrays,hashmap,Java,C#,Arrays,Hashmap,我目前正在寻找一种在java中实现类似c#的方法。例如,在ASP MVC中,您可以编写: DoMethod(new {key = value, another = value2}); 在java中有什么好方法可以做到这一点吗?我只尝试了一个数组:newobject[]{value,value…} 然而,这样我就不会得到键,只会得到值 我知道你可以做到: HashMap<String, object> map = new HashMap(); map.put("key", "valu

我目前正在寻找一种在java中实现类似c#的方法。例如,在ASP MVC中,您可以编写:

DoMethod(new {key = value, another = value2});
在java中有什么好方法可以做到这一点吗?我只尝试了一个数组:
newobject[]{value,value…}
然而,这样我就不会得到键,只会得到值

我知道你可以做到:

HashMap<String, object> map = new HashMap();
map.put("key", "value");
map.put("anoter", "value2");
DoMethod(map);
HashMap map=newhashmap();
地图放置(“键”、“值”);
地图出售(“其他”、“价值2”);
DoMethod(map);
不幸的是,如果你需要经常这样做的话,这是一个很麻烦的方法


干杯

Java本身没有这样的东西。不过,您可能可以在其他JVM语言中找到这样的特性。如果您有选择的自由,并且喜欢动态键入和相关功能,同时保留类似Java的语法,请查看Groovy。

您不能直接在Java中执行此类操作,但可以使用varargs和
Pair
类来模拟它。首先创建一个
类,如下所示

public class Pair<T, U> {

    public static <T, U> Pair<T, U> of(T t, U u) {
        return new Pair<T, U>(t, u);
    }

    private final T t;
    private final U u;

    private Pair(T t, U u) {
        this.t = t; this.u = u;
    }

    public T first() { return t; }

    public U second() { return u; }
}

一个简单的解决方案是使用一对参数

public static <K, V> Map<K, V> newMap(K key, V value, Object... keysAndValues) {
    Map<K, V> temp = new LinkedHashMap<K, V>();
    temp.put(key, value);
    for (int i = 0; i < keysAndValues.length; i+=2)
        temp.put((K) keysAndValues[i], (V) keysAndValues[i+1]);
    return temp;
}

Map<String, Integer> map = newMap("Key1", 1, "Key2", 2);
公共静态映射newMap(K键、V值、对象…keysAndValues){
Map temp=新建LinkedHashMap();
温度输入(键、值);
对于(int i=0;i
试试:

解释:
  • 外部
    {}
    块表示此实例属于一个匿名类extends
    HashMap

  • 内部
    {}
    块表示复制到匿名类构造函数的代码

    不要重新发明轮子。如果您可以自由使用第三方LIB,您可以尝试Google Guava,它提供了不带静态初始值设定项和子类的强类型方法,代理
    条目
    /
    -类或变量参数,这些类或参数可能看起来不安全:

    final Map<String, Object> map = ImmutableMap.<String, Object>of("key", "value", "anoter" "value2");
    DoMethod(map);
    
    使用:

    final Map=new ImmutableMap.Builder()
    .put(“键”、“值”)
    .put(“另一方”、“价值2”)
    .build();
    DoMethod(map);
    
    或者,如果条目数最多为5(请参阅重载为什么所有这些映射工厂方法都是类型安全的):

    final Map=ImmutableMap.of(“key”、“value”、“anoter”、“value2”);
    DoMethod(map);
    
    否;Java不支持匿名类型。您需要什么样的键类型和值类型?键只是字符串。value是一个object我的服务器是用Java编写的,不过还是要谢谢你:)哦,是的,所有JVM语言都编译成相同的字节码,所以你不会失去兼容性。在运行时,您不知道类是用什么语言编写的,也不关心。Groovy实际上是具有更多特性的Java,因为几乎所有有效的Java代码都是有效的Groovy代码。Java是一种企业语言,因此其核心在设计上发展缓慢。快速的创新留给了其他JVM语言。这看起来很有希望!非常感谢。没关系。出于兴趣。你觉得这类事情怎么样(你的解决方案还是我的)?你推荐它吗?或者我们应该等到语言有了合适的映射文字后再开始吗?@pbabcdefp您可以等,但在这些特性成为Java主流之前,您可能要等一段时间。我认为,双括号初始化模式最终应该被认为是有害的:生成了另一个类;它仅适用于非
  • 最终
    课程;它可能会导致(反)序列化问题。此外,在您的例子中,没有任何内容被“复制”到匿名类构造函数:构造函数实际上几乎是空的(只是
    super
    -constructor委托)。内部大括号实际上只包含在构造函数调用之前调用的类初始值设定项。我同意这不是一种有效的方法(我不知道.NET版本的效率),但它是一种语言功能,在我看来更接近OP要求的(syntex-wise),然后是这里的任何其他答案。这几天对我来说又是一个伟大的发现。我一直认为类初始值设定项是JVM的一级公民,就像构造函数一样。对于
    最后的
    -ies也是一样——据我所知,它们也是被复制的(这就是为什么不能通过反射访问初始值设定项)。我对“Java编译器将初始值设定项块复制到每个构造函数中”感到困惑(我不确定调用图)。现在我知道了,谢谢!:)我不知道.NET版本——在C中,它只是语法糖。请看--它只是链接了
    Add
    方法调用。我投了赞成票,因为这可能是初始化映射的最佳方式。我给出了更复杂的答案,因为我相信OP更一般地询问如何将“匿名类型”作为参数传递。答案是,您不能这样做,但您可以编写简单的类并传递它们。
    public static <K, V> Map<K, V> newMap(K key, V value, Object... keysAndValues) {
        Map<K, V> temp = new LinkedHashMap<K, V>();
        temp.put(key, value);
        for (int i = 0; i < keysAndValues.length; i+=2)
            temp.put((K) keysAndValues[i], (V) keysAndValues[i+1]);
        return temp;
    }
    
    Map<String, Integer> map = newMap("Key1", 1, "Key2", 2);
    
    doMethod(new HashMap(){{ put("key", "value"); put("another", "value2"); }});
    
    final Map<String, Object> map = new ImmutableMap.Builder<String, Object>()
           .put("key", "value")
           .put("anoter", "value2")
           .build();
    DoMethod(map);
    
    final Map<String, Object> map = ImmutableMap.<String, Object>of("key", "value", "anoter" "value2");
    DoMethod(map);