那是什么样的功能?
What kind of feature is that?
我无法理解以下代码片段:
Unirest.setObjectMapper(new ObjectMapper() {
private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper
= new com.fasterxml.jackson.databind.ObjectMapper();
public <T> T readValue(String value, Class<T> valueType) {
try {
return jacksonObjectMapper.readValue(value, valueType);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public String writeValue(Object value) {
try {
return jacksonObjectMapper.writeValueAsString(value);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
});
ObjectMapper是一个接口,怎么可以像is一样用new关键字来定义呢?看起来像 java 8 个特征,对吧?
这在 Java 中很常见,您看到的是匿名的 类。相同的代码可以替换为以下内容:
private class ObjectMapperChild extends ObjectMapper
{
private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper
= new com.fasterxml.jackson.databind.ObjectMapper();
public <T> T readValue(String value, Class<T> valueType) {
try {
return jacksonObjectMapper.readValue(value, valueType);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public String writeValue(Object value) {
try {
return jacksonObjectMapper.writeValueAsString(value);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
ObjectmapperChild objMapperChild = new ObjectMapperChild();
Unirest.setObjectMapper(objMapperChild);
这是一个匿名 class。例如,如果您不想创建带有声明的新 class 文件,因为您将仅在代码的那个地方使用此 class,那么您可以这样做。
在 Java 1.8 中引入了函数式接口(只有一种方法的接口),您可以使用 Lambda 表达式声明此类匿名 classes。例如,当您要过滤列表时:
(Person p) -> p.getGender() == Person.Sex.MALE
与
相同
new CheckPerson() {
public boolean test(Person p) {
return p.getGender() == Person.Sex.MALE;
}
}
当
interface CheckPerson {
boolean test(Person p);
}
您可以在此处找到有关 lambda 的更多信息 - https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html。
我无法理解以下代码片段:
Unirest.setObjectMapper(new ObjectMapper() {
private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper
= new com.fasterxml.jackson.databind.ObjectMapper();
public <T> T readValue(String value, Class<T> valueType) {
try {
return jacksonObjectMapper.readValue(value, valueType);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public String writeValue(Object value) {
try {
return jacksonObjectMapper.writeValueAsString(value);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
});
ObjectMapper是一个接口,怎么可以像is一样用new关键字来定义呢?看起来像 java 8 个特征,对吧?
这在 Java 中很常见,您看到的是匿名的 类。相同的代码可以替换为以下内容:
private class ObjectMapperChild extends ObjectMapper
{
private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper
= new com.fasterxml.jackson.databind.ObjectMapper();
public <T> T readValue(String value, Class<T> valueType) {
try {
return jacksonObjectMapper.readValue(value, valueType);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public String writeValue(Object value) {
try {
return jacksonObjectMapper.writeValueAsString(value);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
ObjectmapperChild objMapperChild = new ObjectMapperChild();
Unirest.setObjectMapper(objMapperChild);
这是一个匿名 class。例如,如果您不想创建带有声明的新 class 文件,因为您将仅在代码的那个地方使用此 class,那么您可以这样做。
在 Java 1.8 中引入了函数式接口(只有一种方法的接口),您可以使用 Lambda 表达式声明此类匿名 classes。例如,当您要过滤列表时:
(Person p) -> p.getGender() == Person.Sex.MALE
与
相同 new CheckPerson() {
public boolean test(Person p) {
return p.getGender() == Person.Sex.MALE;
}
}
当
interface CheckPerson {
boolean test(Person p);
}
您可以在此处找到有关 lambda 的更多信息 - https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html。