Java 如何流式传输 .stream()

Java Stream HOW TO .stream()

我正在尝试和谷歌搜索,但无法正确解决。如何用stream写这个?

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 问题的 String[]。

从不需要数组开始。它们是低级的、不灵活的构造,不能很好地与泛型一起使用,通常不应该使用,除非你真的知道你在做什么并且愿意接受一点痛苦来适应它。

流是一种工具。不是普遍的改进。如果迫切需要使用流,一定要这样做。但是不要用流替换所有东西,因为你认为那是某种程度上 'better'。做你喜欢的事:)

如果你必须:

您根本没有使用键,只使用了值。那么为什么要费心使用 entrySet 呢? values() 将以更少的努力得到你想要的东西。

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

这是非常基础的;也许放弃你正在处理的具体案例,先按照一些教程学习,然后再重新开始,你很快就会掌握它的窍门。

为您分解:

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);
 }  

据我所知,这只是将数据库名称集转换为数组。如果是这样,您可能刚刚使用了 allDatabases.toArray(new String[allDatabases.size()]。 Streams 有类似的方法(尽管它们使用 IntFunction 来创建数组而不是新数组):

这转化为:

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

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