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集合实例){…
是为。只有当它是一个集合
时,你才能使用它。是的,但它没有涵盖所有可能的集合类型,例如地图。地图
不是集合
。地图
不是集合。是的,这是我目前拥有的解决方案。谢谢。