我有使用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;操作,返回一个新创建的列表并忽略原始列表?
答案 0 :(得分:19)
collect
与Collectors.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()函数来实现类似的功能。