如何将泛型引入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();