Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从泛型集合获取流?_Java_Java 8_Java Stream - Fatal编程技术网

Java 如何从泛型集合获取流?

Java 如何从泛型集合获取流?,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个参数为对象的函数。此对象可能是最一般意义上的集合:它可以是列表、映射、iterable等,在这种情况下,我希望处理属于它的每个项: public void f(Object o) { if (o instanceof SOMECLASSORINTERFACE<?>) { Stream.of(o).map( .. )...; } else { // o is scalar ... } } public v

我有一个参数为
对象的函数。此对象可能是最一般意义上的集合:它可以是列表、映射、iterable等,在这种情况下,我希望处理属于它的每个项:

public void f(Object o) {
    if (o instanceof SOMECLASSORINTERFACE<?>) {
        Stream.of(o).map( .. )...;
    } else {
        // o is scalar
        ...
    }
}
public void f(对象o){
if(o某个类或接口的实例){
(o)流图(…)。。。;
}否则{
//o是标量
...
}
}
上面的代码不起作用:
Stream.of()
不会将我的对象拆分为要流的元素,但只输出一个元素,即对象
o
本身

我无法使用
o.stream().map…
,因为
o
太通用,可能没有
stream
方法

o
转换为
Collection
不起作用。
此外,检查
Collection
成员资格可能不是正确的做法


那么如何从通用集合中获取流呢?

我目前的解决方案是测试
Iterable
(请参阅)和
Map
成员资格:

public void f(Object o) {
    if (o instanceof Iterable<?>) {
        StreamSupport.stream(((Iterable<?>) o).spliterator(), false).map(e -> ...
    } else if (o instanceof Map<?,?>) {
        ((Map<?,?>) o).entrySet().stream().map(e -> ... 
    } else {
        // scalar object
       ...
    }
}
public void f(对象o){
if(o Iterable的instanceof){
StreamSupport.stream(((Iterable)o).spliterator(),false).map(e->。。。
}else if(o映射实例){
((映射)o).entrySet().stream().Map(e->。。。
}否则{
//标量对象
...
}
}

如果您的
对象
是一个
集合
,并且您希望将其视为一个
集合
,则将其强制转换

public void f(Object o) {
    if (o instanceof Collection<?>) {
        Collection<?> c = (Collection<?>)o;
        c.stream().map(...).forEach(System.out::println);
    } else {
        System.out.println(o);
    }
}
public void f(对象o){
if(o集合的实例){
集合c=(集合)o;
c、 stream().map(…).forEach(System.out::println);
}否则{
系统输出打印ln(o);
}
}

正确的做法当然不是让函数接受
对象,而是使用函数oberloading并考虑你可能会接受什么:

  • 集合
    –这确实有一个
    .stream()
    ,涵盖了大多数情况,例如
    列表
    集合
  • Map
    不在
    Collection
    中,但它的
    .entrySet()
    .keySet()
    等将被删除
  • Iterable
    必须单独使用
    StreamSupport.stream(((Iterable)o.spliterator(),false)
    进行处理,正如您已经提到的那样
因此,为上述三种情况创建三个函数,您可能会很好:

public <T> void f(Stream<T> s) {
    s.map( .. )
        .forEach(System.out::println);
}

public void f(Collection<?> o) {
    f(o.stream());
}

public void f(Map<?,?> m) {
    f(m.entrySet().stream());
}

public void f(Iterable<?> i) {
    f(StreamSupport.stream(i.spliterator(), false));
}

public void f(Object o) {
    // for the cases none of the others match
    System.out.println(o);
}
public void f(流s){
s、 地图(……)
.forEach(System.out::println);
}
公共空间f(集合o){
f(o.stream());
}
公共空间f(地图m){
f(m.entrySet().stream());
}
公共空间f(表一){
f(StreamSupport.stream(i.spliterator(),false));
}
公共空间f(对象o){
//对于这些案例,其他的都不匹配
系统输出打印ln(o);
}

对象不是一个通用集合它是一个通用的一切,您将需要执行强制转换或使用例如Iterable而不是Object。我的
对象是一个
对象
,它可能是也可能不是
集合
@sebnukem这就是
如果(o集合实例){…
是为。只有当它是一个
集合
时,你才能使用它。是的,但它没有涵盖所有可能的集合类型,例如地图。
地图
不是
集合
地图
不是
集合。是的,这是我目前拥有的解决方案。谢谢。