如何在 Java 8 流 api 中实现不变性
how to achieve immutability in Java 8 stream api
考虑以下代码。我读到在处理 Stream API 时在代码中实现不变性很重要。我们如何才能获得所有小写字母且不可变的列表?
List<String> stockList = Arrays.asList("GOOG", "AAPL", "MSFT", "INTC");
List<String> stockList2 = new ArrayList<>();
stockList.parallelStream()
.filter(e -> !e.contains("M"))
.map(String::toLowerCase)
.map(e -> stockList2.add(e))
.collect(toList());
stockList2.forEach(System.out::println);
您不应该使用 map()
向 List
添加元素。 map()
应该将一种类型的 Stream
元素转换为另一种类型的 Stream
元素。
使用 collect(Collectors.toList())
返回的 List
:
List<String> stockList2 =
stockList.stream()
.filter(e -> !e.contains("M"))
.map(String::toLowerCase)
.collect(Collectors.toList());
stockList2.forEach(System.out::println);
您没有改变任何对象。 String
已经是不可变的(toLowerCase
在必要时生成一个新的 String
)并且原始的 List
(stockList
) 不会因创建输出 List
(stockList2
).
考虑以下代码。我读到在处理 Stream API 时在代码中实现不变性很重要。我们如何才能获得所有小写字母且不可变的列表?
List<String> stockList = Arrays.asList("GOOG", "AAPL", "MSFT", "INTC");
List<String> stockList2 = new ArrayList<>();
stockList.parallelStream()
.filter(e -> !e.contains("M"))
.map(String::toLowerCase)
.map(e -> stockList2.add(e))
.collect(toList());
stockList2.forEach(System.out::println);
您不应该使用 map()
向 List
添加元素。 map()
应该将一种类型的 Stream
元素转换为另一种类型的 Stream
元素。
使用 collect(Collectors.toList())
返回的 List
:
List<String> stockList2 =
stockList.stream()
.filter(e -> !e.contains("M"))
.map(String::toLowerCase)
.collect(Collectors.toList());
stockList2.forEach(System.out::println);
您没有改变任何对象。 String
已经是不可变的(toLowerCase
在必要时生成一个新的 String
)并且原始的 List
(stockList
) 不会因创建输出 List
(stockList2
).