如何创建< interface>对象流?

zysjyyx4  于 2021-06-29  发布在  Java
关注(0)|答案(5)|浏览(362)

假设我有:

interface SomeInterface {       
   Foo getFoo();
}

class SomeClass implements SomeInterface {
    Foo getFoo() {
       //returns a Foo object
    }
}

在一次服务中,我有:

List<SomeClass> getItems() {
   //returns a list of SomeClass objects
}

不允许执行以下操作:

Stream<SomeInterface> items = service.getItems().stream();

但最终,我还有其他类可以共享这个接口,并希望执行以下操作:

someMethod(Stream<SomeInterface> items) {
   //some operation
}

有办法吗?喜欢用 flatMap ? (我注意到如果我在 ListSomeClass 物体,我可以 flatMap 返回流的 Package 器 SomeInterface 对象。)
我没有发现类似的问题,也不容易找到解决办法。可能是我错过的容易的东西。 java 14。

55ooxyrt

55ooxyrt1#

如果无法更改getitems()的方法签名,则可以Map流:

import java.util.List;
import java.util.ArrayList;
import java.util.stream.Stream;

public class StreamsDemo {

    static interface SomeInterface {
        String getFoo();
    }

    static class SomeClass implements SomeInterface {
        @Override
        public String getFoo() {
            return "hello";
        }
    }

    static class SomeService {

        List<SomeClass> getFoos() {
            List<SomeClass> list = new ArrayList<>();
            list.add(new SomeClass());
            list.add(new SomeClass());
            return list;
        }
    }

    public static void main(String... args) {
        Stream<SomeInterface> stream = new SomeService().getFoos()
                                                        .stream()
                                                        .map(SomeInterface.class::cast);
        stream.forEach(some -> System.out.println(some.getFoo()));
    }
}
0md85ypi

0md85ypi2#

为什么不直接做这个 getItems() 返回列表 List<SomeInterface> ```
public List getItems()

然后打电话给:

Stream items = service.getItems().stream();

与评论中指出的类似的另一种选择是:

Stream<? extends SomeInterface> stream = service.getItems().stream();

xmq68pz9

xmq68pz93#

在不做任何更改的情况下,您可以只使用java通配符和泛型。 Stream<? extends SomeInterface> items = service.getItems().stream(); 这个 ? 意思是“任何扩展接口的东西,不管是什么 SomeInterface “这样对你的孩子会有用的 SomeClass (以及扩展该接口的任何其他类)
更多信息:https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
示例代码:

public static void main(String args[]) {

            SomeService service = new SomeService();
            Stream<? extends SomeInterface> stream = service.getItems().stream();
        }

        public static class Foo {

        }

        public static interface SomeInterface {
            Foo getFoo();
        }

        public static class SomeClass implements SomeInterface {
            @Override
            public Foo getFoo() {
                return null;
            }
        }

        public static class SomeService {
            public List<SomeClass> getItems() {
                return new ArrayList<>();
            }
        }
    }
gkn4icbw

gkn4icbw4#

一个选项是显式Map具有强制转换的流:

Stream<SomeInterface> items = service.getItems().stream().map(SomeInterface.class::cast);
4ngedf3f

4ngedf3f5#

如果你的目标是让 someMethod 接受数据流 SomeInterface 接口及其子类型,然后您可以使用

/*someReturnTypeHere*/ someMethod(Stream<? extends SomeInterface> items){
   //some operation
}

相关问题