Java流收集器返回的列表是否可以更改?

在使用Java流时,我们可以使用收集器来生成诸如流之类的集合。

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

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

monthNames.toString():[janvier,février,火星,avril,mai,juin,juillet,août,septembre,十月,十一月,décembre]

要创建list unmodifiable,我们可以在Java 10及更高版本中调用List.copyOf

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

➥有没有一种方法可以使带有收集器的流生成无法修改的列表,而无需包装对List.copyOf的调用?

zhaoyp2222 回答:Java流收集器返回的列表是否可以更改?

Collectors.toUnmodifiableList

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

类似于List.copyOf,此功能内置于Java 10及更高版本中。相反,Collectors.toListCollectorsJava 8中的出现而出现。

在示例代码中,只需将最后一部分toList更改为toUnmodifiableList

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

SetMap

Collectors实用程序类提供了用于收集到不可修改的SetMap以及List中的选项。

,

在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) 
        )
;
本文链接:https://www.f2er.com/2473568.html

大家都在问