通过 Java 8 流填充现有 Set<String>

cur*_*eer 1 java java-stream

我是 Java 流和函数式编程的新手,我想知道我的问题是否有一个有效的用例,或者它只是没有意义。我有以下代码,它从数组中提供了一个集合

    public static void main(String[] args) {
        String []arr = {"a","abc","b","cd"};
        Set<String> dict = new HashSet<>();
        Arrays.stream(arr).map(item->{
            System.out.println(item);
            dict.add(item);
            return dict;
        });

//        dict = Arrays.stream(arr).collect(Collectors.toSet());
        System.out.println(dict);
    }
Run Code Online (Sandbox Code Playgroud)

这给了我一个空的字典。如果我按照倒数第二行的方式去做,它就会起作用。有没有一种方法可以改变已经实例化的dict流外部实例化的数据,使其填充到函数中map?

shm*_*sel 5

Stream.map()是一个中间操作,这意味着它只执行管道的一个步骤,但当您调用它时它不会执行任何操作。您需要终端操作才能使流正常工作。对于您的情况,您可以使用forEachOrdered():

Arrays.stream(arr)
        .peek(System.out::println)
        .forEachOrdered(dict::add);
Run Code Online (Sandbox Code Playgroud)

注意:我假设您需要修改现有集合而不是生成新集合是有原因的。否则,只需collect()按照其他答案中的建议使用即可。