具有两个不确定参数的方法



我现在明白了如何按照Java方法创建无限参数

但是我想知道将此扩展为两个参数的语法是什么,类似于printf ?

我想创建无限的String, int对。

目标是显示String1: Int1、String2: Int2等等。我只是不确定语法是什么,更不用说是否可能了。

这不是直接可行的,但这里有一些方法:

  1. 如果字符串是唯一的,您可以将数据作为Map传递:

    public void method(Map<String,Integer> pairs) {
        ...
    }
    
  2. 可以使用两个单独的数组:

    public void method(String[] strings, int[] ints) {
        if (strings.length != ints.length) throw new IllegalArgumentException();
        ...
    }
    

    调用:

    method(new String[] { "a", "b", "c" }, new int[] { 1, 2, 3 });
    

  3. 一切使用Object,以后再整理。它的内部结构很难看,并且缺乏编译时类型检查,但它具有最短的调用语法:

    public void method(Object... args) {
        if (args.length % 2 != 0) throw new IllegalArgumentException();
        for (int i = 0; i < args.length; i += 2) {
            String s = (String)args[i + 0];
            int i = (Integer)args[i + 1];
            ...
        }
    }
    
  4. 使用一个构建器样式的对象:

    public Pairs method() {
        return new Pairs();
    }
    // make the names here meaningful for what your method actually does
    public static class Pairs {
        private static class Pair {
            String s;
            int i;
        }
        private final List<Pair> pairs = new ArrayList<>();
        private Pairs() {}
        public Pairs add(String s, int i) {
            Pair p = new Pair();
            p.s = s;
            p.i = i;
            pairs.add(p);
            return this;
        }
        public void run() {
            for (Pair p : pairs) {
                ... do method's work here ...
            }
        }
    }
    

    根据您想要实现的目标,这可能会使它过于复杂,但它为调用者提供了一种非常愉快且完全类型检查的语法:

    method()
        .add("a", 1)
        .add("b", 2)
        .add("c", 3)
        .run();
    

首先,你不能这样做:

public void foo(String... strings, int... ints) {

因为你会得到一个错误,变量参数strings需要是最后一个

所以你可能想要做一个小包装类,说StringWithInt,然后这样做:

public void foo(StringWithInt... values) {

我希望这对你有帮助!

使参数为Object参数,它有自己的问题…

public void foo(Object... things)

但是最好的办法可能是为每个参数类型使用一个泛型列表:

public void foo(List<String> strings, List<Integer> integers) {}

如果方法特别要求配对对,也可以使用Map<String, Integer>

为什么不直接映射呢?

像这样

public void foo(Map<String,Integer> map){

}

或者用对象代替String和int ?

 public void foo(Object... args){
 }

相关内容

  • 没有找到相关文章

最新更新