【问题标题】:Collect from stream into a multimap从流中收集到多图
【发布时间】:2019-04-30 21:31:40
【问题描述】:

我有一个短语,我在空白处分割并创建一个地图来保存单词和单词的索引位置。

我工作得很好。但问题是当短语包含重复的单词时。所以我想用com.google.common.collect.Multimap

有没有办法使用以下流的收集器生成 Multimap?

List<String> words = new ArrayList<>(Arrays.asList(phrase.split("\\s+")));
Map<String, Integer> tokenMap = IntStream.range(0, words.size())
            .boxed()
            .collect(Collectors.toMap(words::get, i -> i));

【问题讨论】:

  • 技术上这也使用收集器:Multimaps.index(IntStream.range(0, words.size()).boxed().collect(Collectors.toList()), words::get)
  • 使用toMap: Collectors.toMap(Function.identity(), words::get) 并将result 提供给Multimaps.invertFrom(Multimaps.forMap(result), MultimapBuilder.hashKeys().arrayListValues().build())

标签: java java-8 java-stream


【解决方案1】:

你可以用这个:

List<String> words = Arrays.asList("a b c d e a b c".split("\\s+"));
Multimap<String, Integer> tokenMap = IntStream.range(0, words.size()).boxed()
        .collect(ArrayListMultimap::create, (m, i) -> m.put(words.get(i), i), Multimap::putAll);

结果将是:

{a=[0, 5], b=[1, 6], c=[2, 7], d=[3], e=[4]}

【讨论】:

    【解决方案2】:

    Stream.collect() 是一个非常通用的 API,所以没有什么特别的原因不能收集到 Multimap。但是Collectors.toMap() 的任何变体都不能支持这一点,因为com.google.common.collect.Multimap 不是java.util.Map

    我不知道有一个现有的Collector 实现可以完成这项工作,但肯定可以通过直接实现Collector 来编写一个。

    猜你喜欢
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多