使用收集器根据Java中的类将steam拆分为列表

use*_*188 2 java java-stream collectors

以下代码是一个伪代码,表示我想要实现的目标:

Map<Class<?>, List<?>> map = Stream.of(1, "2").collect(Collectors.groupingBy(Object::getClass));
List<Integer> ints = map.get(Integer.class);
List<String> strings = map.get(String.class);
Run Code Online (Sandbox Code Playgroud)

以上是简化的代码.我想要的是我有一个输入列表,我想根据对象的类将它拆分成多个列表.

但是上面的代码没有编译,我想知道你怎么能解决它?

shm*_*sel 5

第一行可以通过更改List<?>List<Object>:

Map<Class<?>, List<Object>> map = Stream.of(1, "2")
        .collect(Collectors.groupingBy(Object::getClass));
Run Code Online (Sandbox Code Playgroud)

下一行更有问题.我认为没有办法在Java中定义那种通用关系.你将不得不使用一个丑陋,不安全的演员:

List<Integer> ints = (List)map.get(Integer.class);
List<String> strings = (List)map.get(String.class);
Run Code Online (Sandbox Code Playgroud)

如果您想使它更安全和用户友好,您可以将其隐藏在自定义类后面:

class TypeToListMap {
    private Map<Class<?>, List<Object>> map = ...

    public <T> List<T> get(Class<T> key) {
        @SuppressWarnings("unchecked")
        List<T> result = (List<T>)map.get(key); 
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `<T> List <T> get(Class <T>)`方法是更好的方法.它不仅隐藏了未经检查的操作; 它将它与应确保正确性的操作相结合,即使用`Class`作为查找键.所以它减少了你可以犯的错误. (2认同)