前几天我才知道你可以做到这一点
new Object() {
void hello() {
System.out.println("Hello World!");
}
}.hello();
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很奇怪.当然,创建的对象的静态类型是Object,所以没有方法hello()?它几乎完全没有意义(hello例如,不可能调用两次).
我有2个问题.
hello就是这样.反思怎么样?谢谢
在这个问题中,用户@Holger提供了一个答案,显示了匿名类的不常见用法,我不知道.
该答案使用流,但这个问题不是关于流,因为这个匿名类型构造可以在其他上下文中使用,即:
String s = "Digging into Java's intricacies";
Optional.of(new Object() { String field = s; })
.map(anonymous -> anonymous.field) // anonymous implied type
.ifPresent(System.out::println);
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,这会编译并打印预期的输出.
注意:我很清楚,自古以来,可以构造一个匿名内部类并使用其成员,如下所示:
int result = new Object() { int incr(int i) {return i + 1; } }.incr(3);
System.out.println(result); // 4
Run Code Online (Sandbox Code Playgroud)
但是,这不是我在这里问的问题.我的情况不同,因为匿名类型是通过Optional方法链传播的.
现在,我可以想象这个功能的一个非常有用的用法......很多时候,我需要map在Stream管道上发出一些操作,同时保留原始元素,即假设我有一个人员列表:
public class Person {
Long id;
String name, lastName;
// getters, setters, hashCode, equals...
}
List<Person> people = ...;
Run Code Online (Sandbox Code Playgroud)
而且我需要Person在某些存储库中存储我的实例的JSON表示,为此我需要每个Person …