在Java中,是否有任何标准接口可用于将对象转换为字符串?
在Java中模拟lambda很有用,但目前您必须实现实现某些接口的就地类 例如,在Java中,是否有任何标准接口可用于将对象转换为字符串?,java,generics,interface,Java,Generics,Interface,在Java中模拟lambda很有用,但目前您必须实现实现某些接口的就地类 例如,join函数可能会获得Stringator接口,因此可以加入任何列表或集合,而不考虑包含的对象: interface Stringator<T> { String toString(T t); } public static <T> String join(Collection<T> col, String delim, Stringator<T> s) {
join
函数可能会获得Stringator接口,因此可以加入任何列表
或集合
,而不考虑包含的对象:
interface Stringator<T> { String toString(T t); }
public static <T> String join(Collection<T> col, String delim, Stringator<T> s) {
StringBuilder sb = new StringBuilder();
Iterator<T> iter = col.iterator();
if (iter.hasNext())
sb.append(s.toString(iter.next()));
while (iter.hasNext()) {
sb.append(delim);
sb.append(s.toString(iter.next()));
}
return sb.toString();
}
请注意,使用标准toString的建议违反了Java约定:toString
用于调试(请查找JavaDoc和JavaLangSpec)
更新Java已经有了在其他方向工作的接口-。每个it实现都可以从字符串
构造对象
。我从对象中查找字符串
更新2。许多人认为我错误地避免了使用字符串。这来自Java 7语言规范(第6.1节):
所以,如果我有Book对象,toString
自然必须返回ISBN,但如果我需要加入Book titles?这就是为什么toString
不太好,而且java.text.Format.Format
或其他看起来更自然。std java中没有ToStringer或类似的接口,您可以定义自己的,并使用
String stringValue()
它类似于intValue()longValue()等,通常在java中使用有java.text.Format.Format
,但它不是很好,是抽象类
Java SE 8可能有一个用于在两种任意类型之间转换的函子接口,其中一种可能是String
OverridetoString()
,它不违反任何Java约定,实际上是一种推荐做法
返回对象的字符串表示形式。总的来说
toString方法返回一个字符串,该字符串“以文本形式表示”此
对象结果应该是简洁但信息丰富的表示
这对一个人来说很容易阅读建议所有
子类重写此方法
重写toString()
没有问题,只是它只提供了一种将对象表示为字符串的方式。我认为ganvenkoa是在建议一些可以让你用习惯的方式轻松表达的东西。想象一下,如果您正在处理一个客户
对象,该对象的toString()
返回John Smith
,但是当您使用加入(…)
加入一组客户时,您希望客户被表示为Smith,John
我在这方面使用的一个工具是com.google.common.collect.Iterables.transform(Iterable)
(它反过来使用函数
),并将结果传递给com.google.common.base.Joiner.join(Iterable)
。
我希望Java 8会变得更加优雅关于“违反Java约定”这件事,你有相关链接吗?因为我没有在语言规范中看到它。在现实世界中没有标准字符串的概念,是吗?所以我不明白这在Java中是如何存在的。BigDecimal在toString()上有一些变体,比如toEngineeringString(),但是没有接口,我想你只能自己编写了!也许您可以使用JSON之类的东西来进行标准化?请注意,因为eclipse和netbeans IDE都有自动为您生成troString()
方法的选项,所以我怀疑您声称它违反了java约定。如果语言创建者不希望您重写它,他们会将其作为最终版本。尽管有一些类仅出于调试目的使用toString
,比如java.awt.Point
和java.awt.Color
(参见javaDocs),但也有很多类出于其他原因使用它(如java.util.BigInteger
或java.util.BigDecimal
)。此外,这里的一般描述:甚至没有提到调试。文本表示可以用于多种用途。使用单独的接口强制开发人员实现方法。toString
不会执行任何此类强制。但无论如何,感谢您对问题的兴趣。+1
List<Book> books = ...;
String list =
join(books, ", ", new Stringator<Book>{ toString(Book b) {return b.getName();} });
A method that converts its object to a particular format F should be named
toF. Examples are the method toString of class Object and the methods
toLocaleString and toGMTString of class java.util.Date.