【问题标题】:Create a Map out of a List of String(s) with streams从带有流的字符串列表中创建地图
【发布时间】:2017-12-12 09:51:01
【问题描述】:

我有一个ListString(s),但我想将它从List<String> 转换为Map<String, Boolean>,使所有boolean 映射设置为true时间>。我有以下代码。

import java.lang.*;
import java.util.*;
class Main {
  public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("ab");
    list.add("bc");
    list.add("cd");
    Map<String, Boolean> alphaToBoolMap = new HashMap<>();
    for (String item: list) {
      alphaToBoolMap.put(item, true);
    }
    //System.out.println(list); [ab, bc, cd]
    //System.out.println(alphaToBoolMap);  {ab=true, bc=true, cd=true}
  }
} 

有没有办法使用流来减少这种情况?

【问题讨论】:

  • 你为什么需要这个?

标签: java data-structures java-8 hashmap java-stream


【解决方案1】:

是的。您还可以使用Arrays.asList(T...) 创建您的List。然后使用Streamcollect 这个和Boolean.TRUE 一样

List<String> list = Arrays.asList("ab", "bc", "cd");
Map<String, Boolean> alphaToBoolMap = list.stream()
        .collect(Collectors.toMap(Function.identity(), (a) -> Boolean.TRUE));
System.out.println(alphaToBoolMap);

输出

{cd=true, bc=true, ab=true}

为了完整起见,我们还应该考虑一个示例,其中一些值应该是false。也许像一个空键

List<String> list = Arrays.asList("ab", "bc", "cd", "");

Map<String, Boolean> alphaToBoolMap = list.stream().collect(Collectors //
        .toMap(Function.identity(), (a) -> {
            return !(a == null || a.isEmpty());
        }));
System.out.println(alphaToBoolMap);

哪些输出

{=false, cd=true, bc=true, ab=true}

【讨论】:

    【解决方案2】:

    我能想到的最短的方法不是单线,但确实很短:

    Map<String, Boolean> map = new HashMap<>();
    list.forEach(k -> map.put(k, true));
    

    这是个人喜好,但我只在需要对源应用转换或过滤掉某些元素等时才使用流。


    正如@holi-java 在 cmets 中所建议的那样,很多时候,使用 MapBoolean 值是没有意义的,因为只有两个可能的值可以映射键。相反,Set 可用于解决您使用Map&lt;T, Boolean&gt; 解决的几乎所有相同问题。

    【讨论】:

    • 首先投票。我认为您应该建议 OP 收集 Set 而不是 Map。那么问题就很简单了,:)。 Stream.of(...).collect(toSet())new HashSet(Arrays.asList(...)) 因为 Boolean 在这种情况下只有 2 个值。
    • @holi-java 你好!为什么是Set? OP 想要一个以列表为键的映射,true 始终为值。
    • 因为将MapBoolean 值一起使用是没有意义的。 Set&lt;String&gt; 几乎可以完成所有的操作。如果他只想打印foo = true 格式,只需使用map(it-&gt; "$it = true") 操作即可。
    • @holi-java 你可能是对的。但是如果不更好地了解 OP 的问题,这样的建议会有点疯狂。
    • :),只是一个建议。它不会影响您的回答。
    【解决方案3】:

    如果您要改变现有的Map&lt;..., Boolean&gt;,可以使用Collections.newSetFromMap。它可以让您将这样的地图视为Set

    Collections.newSetFromMap(alphaToBoolMap).addAll(list);
    

    【讨论】:

    • 调用该方法时指定的map必须为空,且该方法返回后不能直接访问。
    猜你喜欢
    • 1970-01-01
    • 2014-02-27
    • 2022-11-16
    • 2020-04-21
    • 1970-01-01
    • 2012-08-12
    • 2017-01-29
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多