在Java 8中,如何使用lambda将Map< K,V>转换为另一个Map< K,V>?

tzxcd3kk  于 2023-10-14  发布在  Java
关注(0)|答案(8)|浏览(207)

我刚刚开始研究Java 8,为了尝试Java 8,我想我应该尝试重写我最近写的一个非常简单的东西。我需要将一个String到Column的Map转换成另一个String到Column的Map,其中新Map中的Column是第一个Map中的Column的防御副本。列具有复制构造函数。目前为止最接近的是

  1. Map<String, Column> newColumnMap= new HashMap<>();
  2. originalColumnMap.entrySet().stream().forEach(x -> newColumnMap.put(x.getKey(), new Column(x.getValue())));

但我相信一定有更好的方法,我会很感激你的建议。

blpfk2vs

blpfk2vs1#

你可以使用Collector

  1. import java.util.*;
  2. import java.util.stream.Collectors;
  3. public class Defensive {
  4. public static void main(String[] args) {
  5. Map<String, Column> original = new HashMap<>();
  6. original.put("foo", new Column());
  7. original.put("bar", new Column());
  8. Map<String, Column> copy = original.entrySet()
  9. .stream()
  10. .collect(Collectors.toMap(Map.Entry::getKey,
  11. e -> new Column(e.getValue())));
  12. System.out.println(original);
  13. System.out.println(copy);
  14. }
  15. static class Column {
  16. public Column() {}
  17. public Column(Column c) {}
  18. }
  19. }
展开查看全部
wqnecbli

wqnecbli2#

  1. Map<String, Integer> map = new HashMap<>();
  2. map.put("test1", 1);
  3. map.put("test2", 2);
  4. Map<String, Integer> map2 = new HashMap<>();
  5. map.forEach(map2::put);
  6. System.out.println("map: " + map);
  7. System.out.println("map2: " + map2);
  8. // Output:
  9. // map: {test2=2, test1=1}
  10. // map2: {test2=2, test1=1}

你可以使用forEach方法来做你想做的事情。
你在做的是:

  1. map.forEach(new BiConsumer<String, Integer>() {
  2. @Override
  3. public void accept(String s, Integer integer) {
  4. map2.put(s, integer);
  5. }
  6. });

我们可以将其简化为lambda:

  1. map.forEach((s, integer) -> map2.put(s, integer));

因为我们只是调用一个现有的方法,所以我们可以使用method reference,这给了我们:

  1. map.forEach(map2::put);
展开查看全部
5cnsuln7

5cnsuln73#

保持简单,使用Java 8:

  1. Map<String, AccountGroupMappingModel> mapAccountGroup=CustomerDAO.getAccountGroupMapping();
  2. Map<String, AccountGroupMappingModel> mapH2ToBydAccountGroups =
  3. mapAccountGroup.entrySet().stream()
  4. .collect(Collectors.toMap(e->e.getValue().getH2AccountGroup(),
  5. e ->e.getValue())
  6. );
xwbd5t1u

xwbd5t1u4#

不将所有条目重新插入到新Map中的方法应该是最快的,但它不会,因为HashMap.clone也在内部执行反汇编。

  1. Map<String, Column> newColumnMap = originalColumnMap.clone();
  2. newColumnMap.replaceAll((s, c) -> new Column(c));
v1l68za4

v1l68za45#

如果在项目中使用Guava(最低v11),则可以使用Maps::transformValues。

  1. Map<String, Column> newColumnMap = Maps.transformValues(
  2. originalColumnMap,
  3. Column::new // equivalent to: x -> new Column(x)
  4. )

注意:这个Map的值是延迟计算的。如果转换的代价很高,你可以将结果复制到一个新的Map上,就像Guava文档中建议的那样。
当返回的map不需要是视图时,为了避免延迟计算,请将返回的map复制到您选择的新map中。

voj3qocg

voj3qocg6#

这里有另一种方法,可以让你同时访问键和值,以防你必须做某种转换。

  1. Map<String, Integer> pointsByName = new HashMap<>();
  2. Map<String, Integer> maxPointsByName = new HashMap<>();
  3. Map<String, Double> gradesByName = pointsByName.entrySet().stream()
  4. .map(entry -> new AbstractMap.SimpleImmutableEntry<>(
  5. entry.getKey(), ((double) entry.getValue() /
  6. maxPointsByName.get(entry.getKey())) * 100d))
  7. .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
4uqofj5v

4uqofj5v7#

如果你不介意使用第三方库,我的cyclops-react库有所有JDK集合类型的扩展,包括Map。您可以直接使用map或bimap方法来转换Map。一个MapX可以从一个现有的Map构建,例如。

  1. MapX<String, Column> y = MapX.fromMap(orgColumnMap)
  2. .map(c->new Column(c.getValue());

如果您还希望更改密钥,则可以编写

  1. MapX<String, Column> y = MapX.fromMap(orgColumnMap)
  2. .bimap(this::newKey,c->new Column(c.getValue());

bimap可用于同时转换键和值。
当MapX扩展Map时,生成的map也可以定义为

  1. Map<String, Column> y
5jdjgkvh

5jdjgkvh8#

从Java 9开始,在流的map部分进行转换变得更加容易。已经可以使用new AbstractMap.SimpleImmutableEntry了,但是Map接口有一个额外的静态方法Map.entry,它也可以创建一个条目,用于这种情况。

Java 9+

  1. import java.util.Map;
  2. import java.util.Map.Entry;
  3. import java.util.stream.Collectors;
  4. public class App {
  5. public static void main(String[] args) {
  6. Map<String, Column> x;
  7. Map<String, Column> y = x.entrySet().stream()
  8. .map(entry -> Map.entry((entry.getKey(), new Column(entry.getValue())))
  9. .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
  10. }
  11. }
展开查看全部

相关问题