使用流的地图收集产生奇怪的编译错误

时间:2019-02-13 06:34:26

标签: java collections compiler-errors java-stream

我有这种方法:

 public void fields(TableField... s){
    // compilation error on next line
    Collection<String> fields = Arrays.asList(s).stream().map(v -> v.getValue());
    this.fields.addAll(fields);
  }

TableField很简单,就像:

class TableField {
  public String getKey() {
    return this.key;
  }

  public String getValue() {
    return this.value;
  }
}

但我看到此编译错误:

  

不兼容的类型。必需的集合,但推断出“地图”   要流式处理:不存在类型变量R的实例,因此   流符合Collection

3 个答案:

答案 0 :(得分:3)

map返回转换后的Stream。如果要收集,则需要收集流。例如:

Collection<String> fields =
    Arrays.asList(s).stream().map(v -> v.getValue()).collect(Collectors.toList());

答案 1 :(得分:2)

您需要collect个元素,因此可以推断出类型:

Collection<String> fields = Arrays.stream(s) //  Arrays.asList(s).stream()
        .map(TableField::getValue) // map(v -> v.getValue())
        .collect(Collectors.toList()); // or any other collection using 'Collectors.toCollection(<type>::new)'

答案 2 :(得分:2)

在这里使用流没有意义。只是传统的for循环会产生更简洁,性能更高的代码:

for (v : s) fields.add(v.getValue());