在Java中创建泛型类型的随机值

时间:2016-10-30 01:42:38

标签: java generics random

我有以下内容:

public class RandomList {

    private List<Integer> list;

    public List<Integer> getList() {
        return list;
    }

    public RandomList (int n) {
        list = new ArrayList<Integer>();

        Random rand = new Random();
        rand.setSeed(System.currentTimeMillis());

        for (int i=0; i < n; i++)
        {
            Integer r = rand.nextInt();
            list.add(r);
        }
    }   
}

给了我一个填充随机整数值的列表。我想概括一下,也可以得到一个随机字符值列表或者其他类型的列表&#39;随机值。

所以我想要的是通用类型版本class RandomList<T>。我可以随处更换&#34; Integer&#34;通过&#34; T&#34;,但我被困在Integer r = rand.nextInt();行,不同类型的读者会不同。

我正在考虑做以下事情:

  1. 将泛型类传递给RandomList
  2. 使用instanceof检查传入的类中所需的类型(整数,字符...),并根据检查返回正确的随机值
  3. 这有意义吗?是否有其他/更好的方法来实现我想要的目标?

1 个答案:

答案 0 :(得分:7)

第一种方法(劣等)

在Java中,您无法检查泛型类型,至少在没有反射的情况下。你使用泛型类型的钱,所以你会做这样的事情:

public class RandomList<T> {
    private List<T> list;
    private Class<T> clazz;

    public List<T> getList() {
        return list;
    }

    public RandomList (Class<T> clazz, int n) {
        this.clazz = clazz;
        list = new ArrayList<T>();

        Random rand = new Random();
        rand.setSeed(System.currentTimeMillis());

        if (clazz.isAssignableFrom(Integer.class)) {
            for (int i = 0; i < n; i++) {
                Integer r = rand.nextInt();
                list.add(r);
            }
        }
        else {
            throw new IllegalArgumentException("Unsupported class: " + clazz.getName());
        }
    }
}

第二种方法(上级)

或者,您可以进一步概括这一点并添加Function以生成随机化结果。请注意,这需要Java 8.如果您不使用Java 8,则可以定义一个接口并匿名构建。

public class RandomList<T> {
    private List<T> list;

    public List<T> getList() {
        return list;
    }

    public RandomList (Function<Random, T> creator, int n) {
        list = new ArrayList<T>();

        Random rand = new Random();
        rand.setSeed(System.currentTimeMillis());

        for (int i = 0; i < n; i++) {
            list.add(creator.apply(rand));
        }
    }
}

使用以下方法构建新实例:

RandomList<Integer> list = new RandomList<>(rand -> rand.nextInt(), 10);

第三种方法(清洁工)

编辑:以后发生这种情况,但您似乎使用的是Java 8,因此您可以使用流:

List<Integer> list = Stream.generate(() -> rand.nextInt()).limit(10).collect(Collectors.toList())