【问题标题】:Can the list returned by a Java streams collector be made unmodifiable? [duplicate]可以使 Java 流收集器返回的列表不可修改吗? [复制]
【发布时间】:2020-07-22 18:00:26
【问题描述】:

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

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

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 unmodifiable,我们可以在 Java 10 及更高版本中调用 List.copyOf

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

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

【问题讨论】:

标签: java list java-stream collectors unmodifiable


【解决方案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) 
        )
;

【讨论】:

  • 仅供参考,调用Collections::unmodifiableList 会在原始列表上创建一个视图,而不是制作单独的副本。但在此处给出的场景中,我认为这与单独的副本具有相同的效果,因为此代码会吞噬原始列表。
【解决方案2】:

Collectors.toUnmodifiableList

是的,有办法:Collectors.toUnmodifiableList

List.copyOf 一样,此功能内置于Java 10 及更高版本中。相比之下,Collectors.toListJava 8 中以Collectors 的出道出现。

在您的示例代码中,只需将最后一部分 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 的选项。

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多