Java 8将在使用Stream" filter"之后创建一个新的List。并且"收集"?

时间:2016-01-08 00:19:35

标签: java list java-8 java-stream

我有使用Java8的代码:

List<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(5);
list.add(4);
list.add(2);
list.add(5);
list = list.stream().filter(i -> i >= 3).collect(Collectors.toList());

原始列表是[3,5,4,2,5]。在&#34;过滤&#34;并且&#34;收集&#34;操作,列表变为[3,5,4,5]。

是否所有操作都在原始列表中执行,并且不创建新列表?或者&#34;过滤&#34;并且&#34;收集&#34;操作,返回一个新创建的列表并忽略原始列表?

5 个答案:

答案 0 :(得分:19)

collectCollectors.toList()的通话会创建一个新列表。原始列表不受流媒体影响。

答案 1 :(得分:17)

如果您确实想要修改原始列表,请考虑使用removeIf

firstname.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {

            if (!hasFocus) {
                if (!Validate(firstname.getText().toString())) {

                } else {
                    firstname.setFocusable(true);
                    firstname.setError("not valid");
                }
            }else{
                firstname.setError(null);
            }

        }
    });

答案 2 :(得分:3)

流操作是中间操作或终端操作。 中间操作返回一个流,以便您可以链接多个中间操作。 终端操作返回void或其他内容。

大多数流操作都是非干扰的,这意味着他们不会修改流的数据源。 但是,通过调用collect方法,您创建了一个新列表,并将其分配给list

答案 3 :(得分:1)

试试这个:

List<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(5);
list.add(4);
list.add(2);
list.add(5);
List<Integer> list2 = list.stream().filter(i -> i >= 3).collect(Collectors.toList());
System.out.println("list:  "+list);
System.out.println("list2: "+list2);

答案 4 :(得分:1)

参考Guava Lists.transform()函数将帮助您理解新列表需要生成的原因。在JDK 7之前,强烈建议使用Lists.transform()函数来实现类似的功能。