在尝试以函数样式编写代码时,我经常会遇到这样的场景,我想要使用两个函数将一个集合或流映射到另一个:一个函数应用于传递给出谓词和应用于失败元素的另一个函数。这两个函数产生一个公共输出,应该收集这些输出以供进一步处理。使用谓词和两个函数映射集合
下面是Java中一个人为的例子。
Stream.of("foo", "bar", "baz", "qux")
.map(it -> it.startsWith("ba") ? it.toUpperCase() : new StringBuilder(it).reverse())
.forEach(System.out::println);
和Groovy中的例子一样。
["foo", "bar", "baz", "qux"]
.collect{ it.startsWith("ba") ? it.toUpperCase() : it.reverse() }
.each{ println(it) }
我的问题是关于用于实现此映射的条件(三元)语句。有没有一种功能方式来实现这样的映射,而不诉诸分支逻辑?
您正在将过滤和映射组合在相同的步骤中,这使得看到抽象更难一些。我有一个[关于换能器的几个答案](https://stackoverflow.com/search?q=user%3A633183+transducer),你可能有兴趣阅读 - 理解它们之后,你将能够过滤,地图,*和*甚至只是迭代通过你的集合打印*一个*时间^ _^ – naomik
我的理解是,链接操作的效率与语言有关,例如Java流被懒惰地评估,所以每个_terminal_操作只有一次迭代('filter'和'map'是中间操作)。我在这里更感兴趣的是链接一个过滤器,谓词的两端映射到不同的函数。换句话说,它是一个过滤器,它不会除去任何东西,而只是将元素分开以进行单独处理,然后再将它们重新组合为单个转换后的集合。 – jaco0646