Rob*_*ino 27 java generics collections
我有一个int数组:
int[] a = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
我需要一个类型集:
Set<Integer> s;
Run Code Online (Sandbox Code Playgroud)
如果我执行以下操作:
s = new HashSet(Arrays.asList(a));
Run Code Online (Sandbox Code Playgroud)
当然,它认为我的意思是:
List<int[]>
Run Code Online (Sandbox Code Playgroud)
而我的意思是:
List<Integer>
Run Code Online (Sandbox Code Playgroud)
这是因为int是一个原语.如果我使用过String,那么一切都会起作用:
Set<String> s = new HashSet<String>(
Arrays.asList(new String[] { "1", "2", "3" }));
Run Code Online (Sandbox Code Playgroud)
A) int[] a...
Run Code Online (Sandbox Code Playgroud)
至
B) Integer[] a ...
Run Code Online (Sandbox Code Playgroud)
谢谢!
小智 32
使用流:
// int[] nums = {1,2,3,4,5}
Set<Integer> set = Arrays.stream(nums).boxed().collect(Collectors.toSet())
Run Code Online (Sandbox Code Playgroud)
Mat*_*att 12
进一步解释.asList方法具有此签名
public static <T> List<T> asList(T... a)
Run Code Online (Sandbox Code Playgroud)
所以,如果你这样做:
List<Integer> list = Arrays.asList(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)
或这个:
List<Integer> list = Arrays.asList(new Integer[] { 1, 2, 3, 4 })
Run Code Online (Sandbox Code Playgroud)
在这些情况下,我相信java能够推断出你想要一个List,所以它填充了type参数,这意味着它需要Integer参数来调用方法.因为它能够将值从int自动变换为整数,所以很好.
但是,这不起作用
List<Integer> list = Arrays.asList(new int[] { 1, 2, 3, 4} )
Run Code Online (Sandbox Code Playgroud)
因为原始的包装器强制(即int []到Integer [])没有内置到语言中(不确定为什么他们不这样做,但他们没有).
因此,每个基本类型都必须按照自己的重载方法进行处理,这是commons包的功能.即.
public static List<Integer> asList(int i...);
Run Code Online (Sandbox Code Playgroud)
该问题提出两个单独的问题:转换int[]
为Integer[]
和HashSet<Integer>
从中创建int[]
。两者都可以通过Java 8流轻松实现:
int[] array = ...
Integer[] boxedArray = IntStream.of(array).boxed().toArray(Integer[]::new);
Set<Integer> set = IntStream.of(array).boxed().collect(Collectors.toSet());
//or if you need a HashSet specifically
HashSet<Integer> hashset = IntStream.of(array).boxed()
.collect(Collectors.toCollection(HashSet::new));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
42868 次 |
最近记录: |