Java 8中是否可以使用Bifunction替换Tuple?

3
在Java 8中进行一些函数式编程时,我需要像在任何其他函数式编程语言中一样使用元组,但是我发现语言设计者可能通过创建Bifunction来解决元组的需求。如果您需要使用两个参数的函数,则必须使用Bifunction而不是Function,但我找不到任何关于此的文档,Java 8是否真的缺少元组,或者Bifunction可以替代它的使用?注意:这个问题不是“Java SE 8是否有Pairs或Tuples?”因为大多数人都是Bifunction,而另一个问题中没有提到它,我认为现在问题标题更具描述性。

是的,谢谢你纠正我 (y) - Bassem Reda Zohdy
2
不包括元组(和对)是有充分的理由的。如果您正在考虑使用 Function<Pair<T,U>, R>,那么是的,您应该使用 BiFunction<T,U,R>。没有明确的文档告诉您这一点。另一种方法是自己创建一个类似于元组的类(但具有比 left()right() 更合理的访问器方法),然后使用它。 - aioobe
为什么没有元组的详细答案:https://dev59.com/JWAf5IYBdhLWcg3wu0xD#24336841 - Joachim Rohde
也请阅读此文https://dzone.com/articles/whats-wrong-java-8-part-v - coderrick
我真正喜欢Java的原因是人们会写长篇文章和白皮书来解释为什么你不需要某些东西 :-) 幸运的是,有第三方库实现元组和其他方便的功能。我使用Javaslang - S.D.
对于评论中的答案和文章,它们都是好的答案,但是除了在dzone链接中提供"(int x, int y) -> x * y"之外,它们没有提供Bifunction而是使用了Tuble。@S.D.我将会检查它,并且我相信还有其他第三方库可以提供相同的功能,但是我只是想知道为什么JDK没有提供这个功能? - Bassem Reda Zohdy
1个回答

1
您不应该使用BiFunction,因为它并不真正匹配您想要做的语义。我也看不出您如何提议从BiFunction中获取两个不同的值,因为它只返回一个类型的一个元素。 Apache Commons-Lang有一个tuple package包,可以解决这个问题。
但是,否则,我建议创建一个具有两个命名字段的类,以捕获成对的语义。
class UserName {
    private String userName, phoneNumber;
}

变量名中表达意图,这与其他方面不同。
class UserPassword {
    private String userName, password;
}

如果您只在有限的范围内使用它们(即仅在类或包内部),则不必费心编写getter和setter。
否则,您正在尝试对数据形状进行抽象,而不是类的类型或语义,这在Java中非常不惯用。有关此主题的更多信息,请参见作为评论发布的答案

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接