首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java Stream HOW TO .stream()

Java Stream HOW TO .stream()
EN

Stack Overflow用户
提问于 2020-12-02 11:57:18
回答 2查看 55关注 0票数 0

我正在尝试和谷歌,但不能得到正确的。如何用stream来写这个?

代码语言:javascript
运行
复制
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[]。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-02 13:00:09

为你详细分析一下:

代码语言:javascript
运行
复制
Set<String> allDatabases = new HashSet<>();
for (Entry<UUID, Expression> entry : alleMap.entrySet()) {
    allDatabases.add(entry.getValue().getChapter().getDatabaseName());
}

这是获取映射中作为值的表达式的所有章节的所有唯一数据库名称。

代码语言:javascript
运行
复制
 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来创建数组,而不是新数组):

这可以转化为:

代码语言:javascript
运行
复制
alleMap.values().stream()
    .map(Expression::getChapter)
    .map(Chapter::getDatabaseName)
    .distinct()
    .toArray(String[]::new);

注意复制集合唯一性的distinct

票数 2
EN

Stack Overflow用户

发布于 2020-12-02 12:19:47

从不想要数组开始。它们是低级的、不灵活的构造,不适合泛型,通常不应该使用,除非您真的知道自己在做什么,并愿意接受一点痛苦来适应它。

Streams是一个工具。不是一个普遍的改进。如果迫切需要使用streams,请务必使用。但是不要把所有的东西都换成流,因为你认为这样会更好。做你喜欢做的事情:)

如果一定要这样做:

您根本没有使用键,只使用了值。那么,为什么要为entrySet而烦恼呢?values()将以更少的工作量获得您想要的东西。

代码语言:javascript
运行
复制
List<String> alleMap.values().stream()
  .map(e -> e.getChapter().getDataBaseName())
  .collect(Collectors.toList());

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65101995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档