【问题标题】:Fill arbitrary collection with Integers in Java用Java中的整数填充任意集合
【发布时间】:2016-11-25 00:58:34
【问题描述】:

第一个问题,请理解格式错误。

在 java 中,使用流,可以使用 Intstream 用整数填充一些集合,

IntStream.range(from,to).boxed().collect(Collectors.toCollection(HashSet::new));

如果您将HashSet 替换为ArrayListLinkedList,您只需返回指定的集合。

使用它,您如何设置一种方法来指定要填充的所需集合接口?我正在寻找的是这样的:

public returnType fillWithInt(Class<?> t, int from, int to){
   return IntStream.range(from,to)
       .boxed() 
       .collect(Collectors.toCollection(t::new));
}

尝试这个我得到一个警告:

Class(java.lang.ClassLoader)' 在 'java.lang.Class 中具有私有访问权限。

我整天都在做这个,不知道该怎么办。

作为免责声明,我不妨说,我是编程新手,所以我可能完全错误地解决了这个问题。如果是这样的话,我希望能在正确的方向上得到推动!

【问题讨论】:

  • 提示:toCollection 期望的参数类型是什么?
  • @Holger 谢谢你,我已经认识到我对供应商的不确定性,我会去学习!

标签: java collections java-8 java-stream


【解决方案1】:

method reference 不能像您尝试实现的那样使用类的实例来定义,因此您需要实现目标 CollectionSupplier

您可以使用 reflection 作为下一步:

public <C extends Collection<Integer>> C fillWithInt(Class<C> t, int from, int to) {
    return IntStream.range(from,to)
        .boxed()
        .collect(
            Collectors.toCollection(
                () -> {
                    try {
                        return t.newInstance();
                    } catch (InstantiationException | IllegalAccessException e) {
                        throw new IllegalArgumentException(e);
                    }
                }
            )
        );
}

示例:

Set<Integer> set = fillWithInt(HashSet.class, 1, 10);

或者简单地通过提供Supplier 作为方法的参数,如下所示:

public <C extends Collection<Integer>> C fillWithInt(Supplier<C> supplier, 
    int from, int to){
    return IntStream.range(from,to)
        .boxed()
        .collect(Collectors.toCollection(supplier));
}

示例:

Set<Integer> set = fillWithInt(HashSet::new, 1, 10);

【讨论】:

  • 请注意,它在反射变体中不起作用,因为您不能拥有Class&lt;HashSet&lt;Integer&gt;&gt;HashSet.class 将具有类型 Class&lt;HashSet&gt; 引用原始 HashSet 类型。这是无法解决的,所以我们在 Java 8 下不再需要它是件好事。
猜你喜欢
  • 2015-09-24
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 2019-06-11
  • 2011-06-28
  • 2013-01-12
  • 1970-01-01
相关资源
最近更新 更多