最近我为我的JavaFX应用程序安装了Java 8 build 124,我开始收到这些错误:
javafx.fxml.LoadException: Root hasn't been set. Use method setRoot() before load.
/Users/jonathan/Projects/Dominion/target/classes/dominion/application/controller/main_overview_tab.fxml:13
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2613)
at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:104)
at javafx.fxml.FXMLLoader$RootElement.constructValue(FXMLLoader.java:1320)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:740)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2723)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at dominion.application.controller.MainOverviewTab.initView(MainOverviewTab.java:64)
at dominion.application.controller.MainOverviewTab.initializeController(MainOverviewTab.java:55)
at dominion.application.controller.GameSetupController.<init>(GameSetupController.java:37)
at dominion.application.controller.DashboardController.<init>(DashboardController.java:40)
at dominion.application.controller.MainController.<init>(MainController.java:37)
at dominion.application.Dominion.start(Dominion.java:18)
at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837)
at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
javafx.fxml.LoadException: Root hasn't been set. Use method setRoot() before load.
/Users/jonathan/Projects/Dominion/target/classes/dominion/application/controller/players_tab.fxml:13
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2613)
at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:104)
at javafx.fxml.FXMLLoader$RootElement.constructValue(FXMLLoader.java:1320)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:740)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2723)
at …Run Code Online (Sandbox Code Playgroud) 从版本8开始,Java具有基于值的类的概念.这是为了准备将来很可能允许定义值类型的未来版本.两个定义/描述都提到序列化(我添加的粗体):
关于现有的基于价值的课程:
如果程序试图将两个引用区分为基于值的类的相等值,无论是直接通过引用相等还是间接通过引发同步,身份哈希,序列化或任何其他身份敏感机制,程序可能会产生不可预测的结果.
关于未来的价值类型:
通过System.identityHashCode提供的对象的默认基于身份的哈希代码也不适用于值类型.像序列化这样的内部操作会对对象进行基于身份的区分,这些操作要么不适用于值(因为它们不适用于基元),要么它们将使用值类型的hashCode方法提供的基于值的区别.
因为未来的JVM实现可能不会使用对象标头和基于值的类的引用指针,所以一些限制很明显.(例如,没有锁定JVM必须不支持的标识.锁定的引用可以被删除并在以后被另一个替换,这使得释放锁定毫无意义并将导致死锁).
但我不知道序列化如何发挥作用.为什么它被认为是"身份敏感机制"?为什么它"以对象为基础进行基于身份的区分"?
我List<Map<String, String>>列表中的每个项目都是一个地图,例如
companyName - IBM
firstName - James
country - USA
...
Run Code Online (Sandbox Code Playgroud)
我想创建一个Map<String, List<String>>将companyName映射到firstName列表的地方,例如
IBM -> James, Mark
ATT -> Henry, Robert..
private Map<String,List<String>> groupByCompanyName(List<Map<String, String>> list) {
return list.stream().collect(Collectors.groupingBy(item->item.get("companyName")));
}
Run Code Online (Sandbox Code Playgroud)
但这将创建Map<String, List<Map<String, String>>(将comanyName映射到地图列表)
如何创建Map<String, List<String>>?
我尝试过如下,但在两种情况下它都显示同一时间?我做错了什么.
LocalDateTime currentTime = LocalDateTime.now(ZoneId.of("UTC"));
Instant instant = currentTime.toInstant(ZoneOffset.UTC);
Date currentDate = Date.from(instant);
System.out.println("Current Date = " + currentDate);
currentTime.plusHours(12);
Instant instant2 = currentTime.toInstant(ZoneOffset.UTC);
Date expiryDate = Date.from(instant2);
System.out.println("After 12 Hours = " + expiryDate);
Run Code Online (Sandbox Code Playgroud)
"当前日期"时间与"12小时后"相同...
请考虑以下界面:
public interface I {
default String getProperty() {
return "...";
}
}
Run Code Online (Sandbox Code Playgroud)
和刚刚重用默认实现的实现类:
public final class C implements I {
// empty
}
Run Code Online (Sandbox Code Playgroud)
每当C在JSP EL脚本上下文中使用实例时:
<jsp:useBean id = "c" class = "com.example.C" scope = "request"/>
${c.property}
Run Code Online (Sandbox Code Playgroud)
- 我收到了PropertyNotFoundException:
javax.el.PropertyNotFoundException: Property 'property' not found on type com.example.C
javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:268)
javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:221)
javax.el.BeanELResolver.property(BeanELResolver.java:355)
javax.el.BeanELResolver.getValue(BeanELResolver.java:95)
org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)
org.apache.el.parser.AstValue.getValue(AstValue.java:169)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:943)
org.apache.jsp.index_jsp._jspService(index_jsp.java:225)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Run Code Online (Sandbox Code Playgroud)
我最初的想法Tomcat 6.0对于Java 1.8功能来说太旧了,但我很惊讶Tomcat 8.0也受到了影响.当然,我可以通过显式调用默认实现来解决这个问题:
@Override
public String getProperty() {
return I.super.getProperty();
}
Run Code Online (Sandbox Code Playgroud)
- …
我更新到最新的Android N sdk.我唯一不理解的是为什么我无法导入java.time我的代码?我认为Java8可以通过Android N获得.那么为什么谷歌没有添加java.time包?
假设我有一个这样的域模型:
class Lecture {
Course course;
... // getters
}
class Course {
Teacher teacher;
int studentSize;
... // getters
}
class Teacher {
int age;
... // getters
}
Run Code Online (Sandbox Code Playgroud)
现在我可以像这样创建一个教师比较器:
return Comparator
.comparing(Teacher::getAge);
Run Code Online (Sandbox Code Playgroud)
但是,我如何比较Lecture的嵌套字段,像这样?
return Comparator
.comparing(Lecture::getCourse::getTeacher:getAge)
.thenComparing(Lecture::getCourse::getStudentSize);
Run Code Online (Sandbox Code Playgroud)
我无法Lecture.getTeacherAge()在模型上添加方法.
我想知道是否有更好的(或只是其他)方法来获取进入流的终端操作而不是以下的所有项的计数:
Stream<T> stream = ... // given as parameter
AtomicLong count = new AtomicLong();
stream.filter(...).map(...)
.peek(t -> count.incrementAndGet())
Run Code Online (Sandbox Code Playgroud)
其中count.get()给出了该阶段处理项目的实际数量.
我故意跳过了终端的操作,可能之间切换.forEach,.reduce或.collect.我已经知道.count,但它似乎只有在我.forEach用a 交换a .map并使用.countas终端操作时才能正常工作.但在我看来好像.map被滥用了.
我不喜欢上面的解决方案:如果在它之后添加了一个过滤器,它只计算该特定阶段的元素,而不是那些进入终端操作的元素.
我想到的另一种方法是collect将过滤后的值映射到列表中并对其进行操作,然后调用list.size()以获取计数.然而,如果流的集合会导致错误,这将不起作用,而使用上述解决方案,我可以计算到目前为止所有已处理的项目,如果适当的话try/catch.然而,这并不是一项艰难的要求.
Java的LocalDate API似乎在plus(...)用long 调用时给出了错误的答案Period,在这种情况下我遇到一个错误。我在这里做错什么了吗?
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.time.temporal.ChronoUnit;
public class Main
{
public static void main(String[] args)
{
// Long Period
LocalDate birthA = LocalDate.of(1965, Month.SEPTEMBER, 27);
LocalDate eventA = LocalDate.of(1992, Month.MAY, 9);
LocalDate halfA = eventA.plus(Period.between(birthA, eventA));
System.out.println(halfA); // 2018-12-21 ????
System.out.println(ChronoUnit.DAYS.between(birthA, eventA)); // 9721
System.out.println(ChronoUnit.DAYS.between(eventA, halfA)); // 9722 ????
// Short Period
LocalDate birthB = LocalDate.of(2012, Month.SEPTEMBER, 10);
LocalDate eventB = LocalDate.of(2012, Month.SEPTEMBER, 12);
LocalDate halfB = eventB.plus(Period.between(birthB, eventB));
System.out.println(halfB); // …Run Code Online (Sandbox Code Playgroud) 无法编译:
void test(Integer x) {
switch (x) {
case 'a':
}
}
Run Code Online (Sandbox Code Playgroud)
编译OK:
void test(Byte x) {
switch(x) {
case 'a':
}
}
Run Code Online (Sandbox Code Playgroud) java-8 ×10
java ×8
java-time ×2
lambda ×2
android ×1
comparator ×1
el ×1
java-stream ×1
javafx ×1
javafx-8 ×1
jsp ×1
localdate ×1
macos ×1
off-by-one ×1