gpt4 book ai didi

java - 如何在 "::"方法引用运算符附近的 Java Stream API 中进行额外处理

转载 作者:行者123 更新时间:2023-11-29 09:40:33 24 4
gpt4 key购买 nike

使用 Java Stream API,有没有办法进行额外的处理来调整传递给方法引用的任何值?

我举两个例子。

示例 1.

在第一个示例中,我从 Stream<Path> 开始,我想返回一个 Map<String, Path>其中映射中的键是使用另一个函数处理的文件名版本,该函数采用 String文件名(不是 Path )。具体来说:

public Map<String, Path> createMap(Path sourceFolder, PathMatcher filter) {
return stream.filter(filter::matches)
.collect(Collectors.toMap(FilenameHelper::parseFilename, Function.identity()));

parseFilename(String filename)接受一个字符串文件名,但方法引用当然得到一个路径。我想说类似的话,FilenameHelper::parseFilename(((Path)Function.identity()).toFile().getName())但这不起作用(Eclipse 说:“赋值的左侧必须是一个变量”)。我可以通过创建一个采用 Path 的新方法来解决它并且只是return parseFilename(path.toFile().toName())但这并不酷。

示例 2.

在第二个例子中,我有 rows , 一个 List<List<String>>>表示数据表(行,然后是列)。我有一个方法应该返回 List<String>由该表中每第 n 行的特定列组成。我想做类似的事情:

public List<String> getDataFromColumn(String columnName, int nth) {
/// Without a clause at ???, this returns a List<List<String>>
return IntStream.range(0, rows.size())
.filter(n -> n % nth == 0) // Get every nth row
.mapToObj(rows::get)
.???
.collect(Collectors.toList());
}

哪里有“???”应该类似于 map(ArrayList::get(headers.indexOf(columnName))) (其中 headers 是一个包含列标题的 List<String>)但是如果我把它放进去,我会得到一个 AssignmentOperator get 中的语法错误本条款的一部分。替换 mapforEach在这里没有帮助。换句话说,我不想要 rows.get(n) , 我要 rows.get(n).get(headers.indexOf(columnName) .

问题

在这两个示例中,我想对传递给使用方法引用运算符 ( ::) 指向的方法的值做一些额外的事情。 是否有“Java Stream-ic”方式对传递给方法引用的内容进行额外处理?

最佳答案

方法引用本质上是 lambda 的便捷替代品,其中函数签名与方法签名完全匹配。在您的情况下,您可以只使用常规的 lambda:

public Map<String, Path> createMap(Path sourceFolder, PathMatcher filter) {
return stream.filter(filter::matches)
.collect(Collectors.toMap(path -> FilenameHelper.parseFilename(path.toFile().getName()), Function.identity()));
}

public List<String> getDataFromColumn(String columnName, int nth) {
return IntStream.range(0, rows.size())
.filter(n -> n % nth == 0)
.mapToObj(rows::get)
.map(row -> row.get(headers.indexOf(columnName)))
.collect(Collectors.toList());
}

关于java - 如何在 "::"方法引用运算符附近的 Java Stream API 中进行额外处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41130604/

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