Java 8 lambdas don';我不喜欢附加括号?
下面是有问题的代码Java 8 lambdas don';我不喜欢附加括号?,lambda,java-8,Lambda,Java 8,下面是有问题的代码 private ObjectMapper mapper = new ObjectMapper(); @Override public List<GameSession> getAllGameSessions() { try { return Files.list(Paths.get(BASE_DIR)).filter(path -> path.getFileName().toString
private ObjectMapper mapper = new ObjectMapper();
@Override
public List<GameSession> getAllGameSessions() {
try {
return Files.list(Paths.get(BASE_DIR)).filter(path -> path.getFileName().toString().endsWith(FILE_FORMAT_JSON))
.map(path -> {
try (BufferedReader bufferedReader = Files.newBufferedReader(path)) {
return (mapper.readValue(bufferedReader, GameSession.class));
} catch (IOException ioException) {
ioException.printStackTrace();
return null;
}
}).filter(gameSession -> gameSession!=null).collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
return Collections.emptyList();
}
}
显然,所讨论的案文是:
Type 'java/lang/Object' (current frame, locals[4]) is not assignable to 'com/x/game/model/GameSession' (stack map, locals[4])
那么,我是在做一些太聪明的事情,还是Java8又有一些lambda限制,我还没有发现
IntelliJ是快乐的,而runtime不是。如果我用
newgamesession()替换整个lambda映射块代码>然后是快乐的日子。发现了问题。。。return(mapper.readValue(bufferedReader,GameSession.class))中的输入错误代码>
额外的括号,我一直认为额外的括号没有任何区别。好吧,一个令人愉快的例外就是证明了这一点。任何想解释的人,我都会接受解释这种行为的答案
更新了问题标题,以便其他人可以找到解决方案。找到了问题。。。return(mapper.readValue(bufferedReader,GameSession.class))中的输入错误代码>
额外的括号,我一直认为额外的括号没有任何区别。好吧,一个令人愉快的例外就是证明了这一点。任何想解释的人,我都会接受解释这种行为的答案
更新了问题标题,以便其他人可以找到解决方案。这很可能与这些括号无关,而是您正在使用的字节码操作工具(可能不知道)。它可能是JRebel或SpringBoot的SpringLoader,等等
当你加上这些括号时,你可能做了更多的事情,比如移除旧的战争,清理一些东西等等,这就是为什么它起作用的原因 这很可能与那些括号无关,而是您正在使用的字节码操作工具(可能不知道)。它可能是JRebel或SpringBoot的SpringLoader,等等
当你加上这些括号时,你可能做了更多的事情,比如移除旧的战争,清理一些东西等等,这就是为什么它起作用的原因 我想,这是与时间有关的,但这只是一个猜测。至少,我可以确认,在以下不使用任何第三方代码或字节码转换工具的MCVE中,这种行为是可复制的:
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Tmp {
static <T> T readValue(Supplier<T> s, Class<T> type) throws Exception {
return s.get();
}
interface Source extends Supplier<String>, AutoCloseable {
public default void close() throws Exception {}
}
public static void main(String[] args) {
Stream.of("one", "two", "three")
.map(s -> {
try(Source source = () -> s) {
return (readValue(source, String.class));
}
catch(Exception ex) {
return null;
}
})
.forEach(System.out::println);
}
}
导入java.util.function.Supplier;
导入java.util.stream.collector;
导入java.util.stream.stream;
公共级Tmp{
静态T readValue(供应商,类类型)引发异常{
返回s.get();
}
接口源扩展了供应商,可自动关闭{
公共默认void close()引发异常{}
}
公共静态void main(字符串[]args){
“一”、“二”、“三”流
.map(s->{
try(源=()->s){
返回(readValue(source,String.class));
}
捕获(例外情况除外){
返回null;
}
})
.forEach(System.out::println);
}
}
可在支架上进行测试并移除支架
就我所见,这会影响所有版本的Java 8和早期版本的Java 9(与b66和更新版本一起使用)。我想,这与相关,但这只是一个猜测。至少,我可以确认,在以下不使用任何第三方代码或字节码转换工具的MCVE中,这种行为是可复制的:
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Tmp {
static <T> T readValue(Supplier<T> s, Class<T> type) throws Exception {
return s.get();
}
interface Source extends Supplier<String>, AutoCloseable {
public default void close() throws Exception {}
}
public static void main(String[] args) {
Stream.of("one", "two", "three")
.map(s -> {
try(Source source = () -> s) {
return (readValue(source, String.class));
}
catch(Exception ex) {
return null;
}
})
.forEach(System.out::println);
}
}
导入java.util.function.Supplier;
导入java.util.stream.collector;
导入java.util.stream.stream;
公共级Tmp{
静态T readValue(供应商,类类型)引发异常{
返回s.get();
}
接口源扩展了供应商,可自动关闭{
公共默认void close()引发异常{}
}
公共静态void main(字符串[]args){
“一”、“二”、“三”流
.map(s->{
try(源=()->s){
返回(readValue(source,String.class));
}
捕获(例外情况除外){
返回null;
}
})
.forEach(System.out::println);
}
}
可在支架上进行测试并移除支架
据我所见,这会影响所有版本的Java 8和早期版本的Java 9(与b66和更新版本一起使用)。信不信由你,大括号确实起作用,没有任何字节码处理工具/lib参与……信不信由你,大括号确实起作用,没有任何字节码处理工具/库参与…你永远不会抓住我惊讶!你链接到的答案绝对是太棒了。你从来没有抓住让我惊讶的机会!你链接到的答案绝对是不可思议的。