gpt4 book ai didi

Java Lambda 流到不同的集合中

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:29 24 4
gpt4 key购买 nike

我有一个 Java lambda 流,它基于一些基本的过滤来解析文件并将结果存储到一个集合中。

我只是在学习 lambda,所以如果这很糟糕,请多多包涵。但请随时指出我的错误。

对于给定的文件:

#ignored
this
is
#ignored
working
fine

代码:

List<String> matches;

Stream<String> g = Files.lines(Paths.get(givenFile));

matches = g.filter(line -> !line.startsWith("#"))
.collect(Collectors.toList());

["this", "is", "working", "fine"]

现在,我如何将忽略的行收集到同一个流中的第二个列表中?像这样的东西:

List<String> matches;
List<String> ignored; // to store lines that start with #

Stream<String> g = Files.lines(Paths.get(exclusionFile.toURI()));

matches = g.filter(line -> !line.startsWith("#"))
// how can I add a condition to throw these
// non-matching lines into the ignored collection?
.collect(Collectors.toList());

我意识到打开一个新流、稍微改变逻辑并 .collect() 忽略的行是非常简单的。但如果我可以在一个流中完成所有操作,我不想循环遍历该文件两次。

最佳答案

您可以在 Collector 中使用 partitioningBy 而不是两个流

List<String> strings = Arrays.asList("#ignored", "this", "is", "#ignored", "working", "fine");
Map<Boolean, List<String>> map = strings.stream().collect(Collectors.partitioningBy(s -> s.startsWith("#")));
System.out.println(map);

输出

{false=[this, is, working, fine], true=[#ignored, #ignored]}

这里我使用 key 作为 Boolean 但你可以将它更改为有意义的字符串或枚举

编辑

如果字符串可以以其他一些特殊字符开头,您可以使用 groupingBy

    List<String> strings = Arrays.asList("#ignored", "this", "is", "#ignored", "working", "fine", "!Someother", "*star");
Function<String, String> classifier = s -> {
if (s.matches("^[!@#$%^&*]{1}.*")) {
return Character.toString(s.charAt(0));
} else {
return "others";
}
};
Map<String, List<String>> maps = strings.stream().collect(Collectors.groupingBy(classifier));
System.out.println(maps);

输出

{!=[!Someother], #=[#ignored, #ignored], *=[*star], others=[this, is, working, fine]}

你也可以嵌套 groupingBypartitioningBy

关于Java Lambda 流到不同的集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40011903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com