1

在处理 Java 流时,我们可以使用收集器来生成一个集合,例如流。

例如,这里我们创建一个Month枚举对象流,并为每个对象生成一个String包含月份的本地化名称。我们通过调用 将结果收集到一个List类型中。StringCollectors.toList()

List < String > monthNames = 
        Arrays
        .stream( Month.values() )
        .map( month -> month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) )
        .collect( Collectors.toList() )
;

monthNames.toString(): [janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre]

为了使该列表不可修改,我们可以List.copyOf在 Java 10 及更高版本中调用。

List < String > monthNamesUnmod = List.copyOf( monthNames );

➥ 有没有办法让带有收集器的流产生一个不可修改的列表,而我不需要包装调用List.copyOf

4

2 回答 2

5

Collectors.toUnmodifiableList

是的,有一种方法:Collectors.toUnmodifiableList

就像List.copyOf,此功能内置于Java 10及更高版本中。相比之下,Collectors.toList出现CollectorsJava 8中的首次亮相。

在您的示例代码中,只需将最后一部分更改toListtoUnmodifiableList.

List < String > monthNames = 
        Arrays
        .stream( Month.values() )
        .map( month -> month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) )
        .collect( Collectors.toUnModifiableList() )  //  Call `toUnModifiableList`.
;

Set还有Map_

Collectors实用程序类提供了用于收集到不可修改SetMap以及List.

于 2020-04-10T01:12:58.523 回答
1

在 Java 8 中,我们可以使用Collectors.collectingAndThen.

List < String > monthNames =
    Arrays
        .stream( Month.values() )
        .map( month -> month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) )
        .collect( 
            Collectors.collectingAndThen(Collectors.toList(), 
            Collections::unmodifiableList) 
        )
;
于 2020-04-10T01:43:09.357 回答