java stream how to.stream()

hivapdat  于 2021-07-07  发布在  Java
关注(0)|答案(2)|浏览(339)

我正在努力和谷歌搜索,不能得到它的权利。如何用流写这个?

private final ConcurrentMap<UUID, Expression> alleMap = new ConcurrentHashMap<>(1000);

 private String[] getAllDatabases()
  {
     Set<String> allDatabases = new HashSet<>();
     for (Entry<UUID, Expression> entry : alleMap.entrySet())
     {
        allDatabases.add(entry.getValue().getChapter().getDatabaseName());
     }
     List<String> allDatabasesList = new ArrayList<>(allDatabases);
     String[] result = new String[allDatabases.size()];
     for (int i=0; i < result.length; i++)
     {
        result[i] = allDatabasesList.get(i);
     }  
     return result;
  }

alleMap.values().stream().???

我需要数组的原因是,我正在编写一个swing应用程序,并且需要joptionpane问题的字符串[]。

pdtvr36n

pdtvr36n1#

为您分解:

Set<String> allDatabases = new HashSet<>();
for (Entry<UUID, Expression> entry : alleMap.entrySet()) {
    allDatabases.add(entry.getValue().getChapter().getDatabaseName());
}

这将为Map中的值表达式的所有章节获取所有唯一的数据库名称。

List<String> allDatabasesList = new ArrayList<>(allDatabases);
 String[] result = new String[allDatabases.size()];
 for (int i=0; i < result.length; i++) {
    result[i] = allDatabasesList.get(i);
 }

据我所知,这一切只是为了将一组数据库名称转换为一个数组。如果是的话,你可以用 allDatabases.toArray(new String[allDatabases.size()] . 流也有类似的方法(尽管它们采用 IntFunction 要创建数组而不是新数组,请执行以下操作:
这意味着:

alleMap.values().stream()
    .map(Expression::getChapter)
    .map(Chapter::getDatabaseName)
    .distinct()
    .toArray(String[]::new);

注意 distinct 复制集合的唯一性。

4ngedf3f

4ngedf3f2#

从不需要数组开始。它们是低级的、不灵活的构造,不能很好地处理泛型,通常不应该使用它们,除非你真的知道自己在做什么,并且愿意接受一点痛苦来适应它。
流是一种工具。不是普遍的进步。如果有急迫的需要,一定要随波逐流。但是不要因为你认为流更好,就用流来代替一切。做你觉得舒服的事:)
如果您必须:
你根本不使用键,只使用值。那为什么要费心使用入口集呢?values()将以更少的努力得到您想要的。

List<String> alleMap.values().stream()
  .map(e -> e.getChapter().getDataBaseName())
  .collect(Collectors.toList());

这是相当基本的;也许放弃你正在处理的具体案例,先学习一些教程,然后再重新学习,你很快就会掌握窍门。

相关问题