在Java中模拟lambda很有用,但是目前你必须实现实现某个接口的就地类......
例如,join
函数可能会获得 Stringator 接口,因此无论包含的对象如何,都可以加入任何List
或Collection
:
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();
}
我不知道任何标准 Stringator 或 ToStringer 界面......
这个join
实现可以简化bean操作。例如,获取书籍清单:
List<Book> books = ...;
String list =
join(books, ", ", new Stringator<Book>{ toString(Book b) {return b.getName();} });
请注意,使用标准 toString 的建议违反了Java约定:toString
用于调试(查找JavaDoc和Java lang规范)!
更新 Java已经有了向其他方向工作的界面 - PropertyEditor。每个实现都可以从Object
构建String
。我从String
...
Object
更新2 。许多人认为我错误地避免toString
。这来自Java 7 Lang Spec(第6.1节):
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.
因此,如果我有Book对象,toString
自然必须返回ISBN,但如果我需要加入书名?这就是toString
不那么好,java.text.Format.format
或其他看起来更自然的原因。
答案 0 :(得分:2)
覆盖toString()
,它不违反任何java惯例,实际上是推荐的做法。
返回对象的字符串表示形式。一般来说, toString方法返回一个“文本表示”的字符串 宾语。结果应该是简洁但信息丰富的表示 一个人很容易阅读。 建议全部 子类重写此方法。
http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#toString%28%29
答案 1 :(得分:1)
std java中没有ToStringer或类似的界面,你可以定义自己的,并使用
String stringValue()
类似于intValue()longValue()等,通常用于java
答案 2 :(得分:1)
有java.text.Format.format
,但它不是很好,而且是抽象类。
Java SE 8可能有一个仿函数接口,用于在两种任意类型之间进行转换,其中一种类型可能是String
。
答案 3 :(得分:1)
覆盖toString()
之外没有任何问题,只有这样才能让您只有一种方式将对象表达为字符串。我认为ganvenkoa建议的东西可以让你轻松地以自定义的方式表达它。想象一下,如果您正在处理Customer
返回toString()
的{{1}}对象,但是当您使用John Smith
加入一群客户时,您希望客户成为表示为join(...)
。
我曾用过的一件事是Smith, John
这样的实用程序(后者又使用com.google.common.collect.Iterables.transform(Iterable)
)并将结果传递给Function
。
我希望Java 8会变得更优雅