如何转换Map>映射<字符串,设置<字符串>>使用 forEach 操作

发布于 2025-01-16 05:23:45 字数 519 浏览 1 评论 0 原文

我想将 Map> 转换为 Map> 以优化搜索。我想出了下面的传统方法。

 for (Map.Entry<String, List<String>> entry : this.mapWithList.entrySet()) {
        Set<String> hSet = new HashSet<>(entry.getValue());
        this.mapWithSet.put(entry.getKey(), hSet);
   }

我想知道如何在 Java 8 中使用 forEach 来做到这一点。

另外,使用forEach lambda,代码性能会更好吗?

I want to convert a Map<String,List<String>> to Map<String,Set<String>> for optimized search. I came up with the below traditional approach.

 for (Map.Entry<String, List<String>> entry : this.mapWithList.entrySet()) {
        Set<String> hSet = new HashSet<>(entry.getValue());
        this.mapWithSet.put(entry.getKey(), hSet);
   }

I am wondering how can I do it using forEach in Java 8.

Also, with the forEach lambda, will it be any better with the code performance?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

还不是爱你 2025-01-23 05:23:46

代码性能会更好吗?

不,不会的。 迭代解决方案通常性能更高。

如何使用forEach来做到这一点

Stream API中有一个特殊的操作collect(),旨在填充一个可变容器 (例如CollectionStringBuilder等)与流管道的内容。 文档。当没有其他方法可以实现这一点时,请考虑仅将 forEach() 作为最后的手段

要使用 collect() 执行此操作,首先,您需要创建一个条目流

基于每个条目,必须创建一个新条目map()操作用于此目的。静态方法Map.entry()用于实例化一个新条目。

然后通过传递 Collectors.toMap() 作为参数来应用终端操作 collect(),这会创建一个收集器负责将流元素放入可变容器中的对象,在本例中为映射)基于提供的两个函数(对于< em>按键)。

main()

public static void main(String[] args) {
    Map<String,List<String>> mapWithList =
            Map.of("1", List.of("1", "2", "3"));

    Map<String,Set<String>> result =
       mapWithList.entrySet().stream()
                  .map(entry -> Map.entry(entry.getKey(),
                            new HashSet<>(entry.getValue())))
                  .collect(Collectors.toMap(Map.Entry::getKey,
                                            Map.Entry::getValue));
    System.out.println(result);
}

输出

{1=[1, 2, 3]}

will it be any better with the code performance?

No, it'll not. Iterative solutions are usually more performant.

how can I do it using forEach

There's a special operation collect() in the Stream API that is meant to populate a mutable container (e.g. Collection, StringBuilder, etc.) with the contents of the stream pipeline. Usage of forEach() for that purpose is highly discouraged by the documentation. Consider utilizing forEach() only as a last resort, when there's no other way to achieve that.

To do that with collect(), first, you need to create a stream of entries.

Based on each entry, a new entry has to be created, map() operation is utilized for that purpose. Static method Map.entry() is used to instantiate a new entry.

And then apply the terminal operation collect() by passing Collectors.toMap() as parameter, which creates a collector (object responsible for placing the stream elements into a mutable container, a map in this case) based on the two provided functions (for keys and values).

main()

public static void main(String[] args) {
    Map<String,List<String>> mapWithList =
            Map.of("1", List.of("1", "2", "3"));

    Map<String,Set<String>> result =
       mapWithList.entrySet().stream()
                  .map(entry -> Map.entry(entry.getKey(),
                            new HashSet<>(entry.getValue())))
                  .collect(Collectors.toMap(Map.Entry::getKey,
                                            Map.Entry::getValue));
    System.out.println(result);
}

Output

{1=[1, 2, 3]}
方圜几里 2025-01-23 05:23:46

您可以使用这种方法:

public static void main(String[] args) {
        Map<String, List<String>> inputMap = new HashedMap<>();
        List<String> a = new ArrayList<>();
        a.add("a1");
        a.add("a2");
        inputMap.put("a", a);

        List<String> b = new ArrayList<>();
        b.add("b1");
        b.add("b2");

        inputMap.put("b", b);

        System.out.println(inputMap);

        Map<String, Set<String>> resultSet= inputMap.entrySet().stream()
                .collect(Collectors.toMap(Entry::getKey, e -> new HashSet<>(e.getValue())));

        System.out.println(resultSet);
    }

You can use this approach:

public static void main(String[] args) {
        Map<String, List<String>> inputMap = new HashedMap<>();
        List<String> a = new ArrayList<>();
        a.add("a1");
        a.add("a2");
        inputMap.put("a", a);

        List<String> b = new ArrayList<>();
        b.add("b1");
        b.add("b2");

        inputMap.put("b", b);

        System.out.println(inputMap);

        Map<String, Set<String>> resultSet= inputMap.entrySet().stream()
                .collect(Collectors.toMap(Entry::getKey, e -> new HashSet<>(e.getValue())));

        System.out.println(resultSet);
    }
↙厌世 2025-01-23 05:23:46

使用 gson 的一行解决方案! (或任何其他 JSON 序列化程序)

Map<String, Set<String>> result = gson.fromJson(gson.toJson(otherMap), Map.class);

两个映射都具有相同的 JSON 表示形式。跳出框框思考;)

one line solution using gson! (or any other JSON serializer)

Map<String, Set<String>> result = gson.fromJson(gson.toJson(otherMap), Map.class);

both maps have the same JSON representation. think outside the box ;)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文