如何将泛型引入java流

如何将泛型引入java流,java,generics,Java,Generics,我有一个第三方方法只返回List,没有泛型。我想流式处理此列表,我知道它包含特定类型,例如String 有没有一个优雅的方法来处理这个问题 long containA = externalMethodReturningList() .stream() .filter(s -> s.contains("a")) // compiler error here .count(); // I cannot change the signature: List exter

我有一个第三方方法只返回
List
,没有泛型。我想流式处理此列表,我知道它包含特定类型,例如
String

有没有一个优雅的方法来处理这个问题

long containA = externalMethodReturningList()
    .stream()
    .filter(s -> s.contains("a"))  // compiler error here
    .count();

// I cannot change the signature:
List externalMethodReturningList() {  
    return List.of("aba", "bbc", "cab");
}

编辑:我最初的想法是将
流的元素映射到
字符串:

long containA = externalMethodReturningList()
    .stream()
    .map(Object::toString)
    .filter(s -> s.contains("a")) 
    .count();
但是,这不起作用,因为在原始
列表上调用
stream()
会生成一个原始
,即使在
映射
操作之后,它仍然是一个原始

一个可行的解决方案是将
强制转换为

long containA=
((流)externalMethodReturningList().Stream())
.filter(s->s.contains(“a”))
.count();
我知道有点难看


使用一个返回
列表的方法来包装
externalMethodReturningList()
,并将该包装方法用作
管道的源代码,可能会更干净。

遗留问题不会对其他代码产生太大影响。因此,我认为在stream pipeline中不需要额外的步骤或类似的步骤-只需抛出列表:

long containA = ((List<String>) externalMethodReturningList())
    .stream()
    .filter(s -> s.contains("a"))
    .count();
long containA=((List)externalMethodReturningList())
.stream()
.filter(s->s.contains(“a”))
.count();

然后,一旦您可以更改签名,您只需删除演员阵容,其他一切都会恢复正常。

是的,我知道这个解决方案,但我觉得它并不优雅。在我的例子中,该方法位于另一个对象上,因此看起来像
method1(…).execute(…).getList()
,而强制转换在那里非常难看。我希望有更好的方法,但可能没有。无论如何谢谢你@Barney也许你应该把调用链分成两个语句。第一种方法将方法返回的原始列表分配给
List
变量,第二种方法在泛型列表上运行管道。这确实是我的实际解决方案,但我现在对Java有点失望:-)
long containA = ((List<String>) externalMethodReturningList())
    .stream()
    .filter(s -> s.contains("a"))
    .count();