在Java中,是否有任何标准接口可用于将对象转换为字符串?

在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) {

在Java中模拟lambda很有用,但目前您必须实现实现某些接口的就地类

例如,
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

Override
toString()
,它不违反任何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.