我正在尝试和谷歌,但不能得到正确的。如何用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[]。
发布于 2020-12-02 13:00:09
为你详细分析一下:
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。
发布于 2020-12-02 12:19:47
从不想要数组开始。它们是低级的、不灵活的构造,不适合泛型,通常不应该使用,除非您真的知道自己在做什么,并愿意接受一点痛苦来适应它。
Streams是一个工具。不是一个普遍的改进。如果迫切需要使用streams,请务必使用。但是不要把所有的东西都换成流,因为你认为这样会更好。做你喜欢做的事情:)
如果一定要这样做:
您根本没有使用键,只使用了值。那么,为什么要为entrySet而烦恼呢?values()将以更少的工作量获得您想要的东西。
List<String> alleMap.values().stream()
.map(e -> e.getChapter().getDataBaseName())
.collect(Collectors.toList());这是非常基础的;也许放下你正在处理的具体案例,先学习一些教程,然后重新开始,你很快就会掌握它的诀窍。
https://stackoverflow.com/questions/65101995
复制相似问题