Loop.times(5, () -> {
System.out.println("looping");
});
Run Code Online (Sandbox Code Playgroud)
哪些有效编译到?
for(int i = 0; i < 5; i++)
System.out.println("looping");
Run Code Online (Sandbox Code Playgroud)
或类似的东西
new CallableInterfaceImpl(){
public void call(){
for(int i = 0; i < 5; i++)
System.out.println("looping");
}
}.call();
Run Code Online (Sandbox Code Playgroud)
它会替换(内联类),还是实际创建一个匿名类?
这是我的代码的样子,目前还不清楚如何/为什么executorService.submit(work::get)会ClassNotFoundException在有问题的匿名类上抛出 a 。它不会一直发生,但是一旦遇到此异常,它似乎无法恢复——随后的请求会遇到相同的异常。任何人都知道可能导致这种情况发生的原因是什么?
编辑:我可以确认对这个方法的所有调用在 VM 会话中都有效,或者没有一个有效 - 它不像某些成功而其他人由于上述异常而失败。
进一步编辑:https : //bugs.openjdk.java.net/browse/JDK-8148560正是我遇到的错误,但由于不可重现和/或记者没有回应,该错误已关闭。不知何故,由 lambda 表达式产生的匿名类型看起来像是在执行程序执行表达式之前被垃圾收集,但显然并非总是如此。使用的 jdk 是openjdk1.8.0_221.
package com.ab.cde.ct.service.impl;
@Service
public class IngestionService {
@Autowired private TransactionTemplate transactionTemplate;
@Autowired private AsyncTaskExecutor executorService;
@Transactional
public void ingest(Data data) {
Supplier<Optional<String>> work = () -> transactionTemplate.execute(s -> {
// actual work on the data object, enclosed in a try/catch/finally
});
executorService.submit(work::get); // this is where the exception gets thrown
}
}
Run Code Online (Sandbox Code Playgroud)
这是异常堆栈跟踪的样子(行号不对应,因为上面的代码只是一个原型):
2019-10-23 19:11:35,267|[http-apr-26001-exec-10]|[B6AC864143092042BBB4A0876BB51EB6.1]|[]|[ERROR] web.error.ErrorServlet [line:142] …Run Code Online (Sandbox Code Playgroud) 我知道箭头的左侧有参数,箭头的右侧是参数所在的函数.但是,我想知道java 8如何映射左侧和右侧并转换为函数.那里发生了什么,我在哪里可以找到这些信息?
我有以下方法调用,其中传递了一个lambda表达式。这里是否隐式实例化了一个类?
printStudents(
roster,
(Student s) -> s.getGender() == Student.Sex.MALE
&& s.getAge() >= 18
&& s.getAge() <= 25
);
Run Code Online (Sandbox Code Playgroud)
方法签名:
printStudents(List<Student> roster, CheckStudent checkstudet)
Run Code Online (Sandbox Code Playgroud)
interface CheckStudent {
boolean test(Student s);
}
Run Code Online (Sandbox Code Playgroud)
编辑
你们中有些人建议我重构代码,但是出现了同样的问题。
CheckStudent checkStudent = (Student s) -> s.getGender() == Student.Sex.MALE && s.getAge() >= 18 && s.getAge() <= 25;
Run Code Online (Sandbox Code Playgroud)
是否Student在作业的右侧实例化了一个类(我不是指class )?