gpt4 book ai didi

java - 转换和泛型以在 Java 8 中启用列表连接

转载 作者:搜寻专家 更新时间:2023-10-31 08:14:34 25 4
gpt4 key购买 nike

抱歉,这可能是我用过的最糟糕的标题,但我想不出该如何表达。

我正在调用一个返回泛型的方法 table.getColData(COL_1)

public <T extends Object> List<T> getColData(final String col)

我调用了两次并获得了两个字符串列表。我想连接这些并以这个结束 -

List<String> a = table.getColData(col1);
List<String> b = table.getColData(col2);

List <String> c = Stream.concat(a.stream(), b.stream()).collect(Collectors.toList());

我认为这很好用。我找不到避免这 2 个声明的方法,但不会出现 concat 的错误。认为它有一个不是 String 的对象列表s(提示:将 c 的类型更改为 List<Object>)?

有没有一种简单的方法可以使它看起来更加精致?!

最佳答案

您受限于编译器的推断。

List <String> c = Stream.concat(getColDataStream(col1).stream(), getColDataStream(col2).stream()).collect(Collectors.toList());

无法编译因为getColDataStream()返回被推断为 List<Object>因为您没有从调用端指定目标类型。
您可以连接两个 List<Object> 流但它不会产生Stream<String>但是Stream<Object> .
引入两个中间变量并不是最好的方法。

1) 作为 Holger 建议的替代方案,您可以指定 T从目标端输入:

 Stream.concat(table.<String>getColData(col1).stream(), table.<String>getColData(col2).stream()) 
.collect(Collectors.toList());

2) 你也可以转换 Stream<Object>Stream<String>map()操作:

List<String> c = Stream.concat(table.getColData(col1).stream(), table.getColData(col2).stream())
.map(s -> (String) s)
.collect(Collectors.toList());

3) 或者引入一种额外的方法,通过连接列表流来防止任何显式转换,并将其收集在 List 中。它返回:

public <T> List<T> concatAndCollectToList(final List<T> a, List<T> b) {
return Stream.concat(a.stream(), b.stream())
.collect(Collectors.toList());
}

你现在可以这样做:

List<String> c = concatAndCollectToList(table.getColData(col1), table.getColData(col2));

关于java - 转换和泛型以在 Java 8 中启用列表连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51949552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com