使用Java8流在集合上收集HashSet会出现“Type Mismatch”错误

时间:2016-01-20 06:12:52

标签: java eclipse java-8 java-stream hashset

以下代码按预期编译:

import java.util.Arrays;
import java.util.HashSet;
import java.util.stream.Collectors;

public class Test2 {
    String[] tt = new String[]{ "a", "b", "c"};

    HashSet<String> bb =
        Arrays.asList(tt).stream().
        map(s -> s).
        collect(Collectors.toCollection(HashSet::new));
}

如果我将tt更改为HashSet,Eclipse编译器将失败并显示消息Type mismatch: cannot convert from Collection<HashSet<String>> to HashSet<String>

public class Test2 {
    HashSet<String> tt = new HashSet<String>(Arrays.asList(new String[]{ "a", "b", "c"}));

    HashSet<String> bb =
        Arrays.asList(tt).stream().
        map(s -> s).
        collect(Collectors.toCollection(HashSet::new));
}

1 个答案:

答案 0 :(得分:4)

这是预料之中的。 Arrays.asList() takes a vararg as argument。因此,它需要几个对象或一个对象数组,并将这些对象存储在列表中。

您正在传递一个HashSet作为参数。所以这个HashSet存储在一个列表中,因此你最终得到一个包含单个HashSet的列表。

要将Set转换为List,请使用new ArrayList<>(set)。或者,不要将其转换为列表,因为这是不必要的。