我正在尝试对名为parts
的ArrayList执行以下流操作:
parts
.stream()
.map(t -> t.toLowerCase())
.distinct()
.sorted()
.collect(Collectors.toList());
其中parts
包含这样的字符串:
Adventures
in
Disneyland
Two
blondes
were
going
to
Disneyland
....
除了查看调试器外,parts
完全没有改变。不确定我是否缺少流程的某些步骤?
答案 0 :(得分:7)
在查看调试器时,“部件”完全没有改变
正确。流不修改用于创建流的集合的元素。流最终返回包含映射项的 new List
。只需创建一个变量并为其分配流操作的返回值即可:
List<String> modifiedList = parts.stream()
.map(t -> t.toLowerCase())
.distinct()
.sorted()
.collect(Collectors.toList());
答案 1 :(得分:4)
您没有将收集到的列表存储在任何地方。流不会就地更改集合。
您应该这样做:
parts = parts.stream().....;
根据评论编辑:
要获得ArrayList
而不是List
,请将您的收藏家更改为:
.collect(Collectors.toCollection(ArrayList::new));
答案 2 :(得分:1)
流不会改变流的来源,因此您正在观察预期的行为。
您应该捕获流处理的结果,并在调试器中对其进行检查,例如。
List<String> result = parts.stream()...
答案 3 :(得分:1)
这将创建一个新列表,这是地图操作员的工作方式。您正在用新对象替换流中的项目,然后将流收集到新列表中。
您必须将结果分配给新列表。