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参与……信不信由你,大括号确实起作用,没有任何字节码处理工具/库参与…你永远不会抓住我惊讶!你链接到的答案绝对是太棒了。你从来没有抓住让我惊讶的机会!你链接到的答案绝对是不可思议的。