标签: java-8

没有使用Java 8 Eclipse设置Root错误

最近我为我的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)

java macos javafx java-8 javafx-8

18
推荐指数
1
解决办法
1万
查看次数

为什么Java的基于价值的类不能被序列化?

从版本8开始,Java具有基于值的的概念.这是为了准备将来很可能允许定义值类型的未来版本.两个定义/描述都提到序列化(我添加的粗体):

关于现有的基于价值的课程:

如果程序试图将两个引用区分为基于值的类的相等值,无论是直接通过引用相等还是间接通过引发同步,身份哈希,序列化或任何其他身份敏感机制,程序可能会产生不可预测的结果.

关于未来的价值类型:

通过System.identityHashCode提供的对象的默认基于身份的哈希代码也不适用于值类型.像序列化这样的内部操作会对对象进行基于身份的区分,这些操作要么不适用于值(因为它们不适用于基元),要么它们将使用值类型的hashCode方法提供的基于值的区别.

因为未来的JVM实现可能不会使用对象标头和基于值的类的引用指针,所以一些限制很明显.(例如,没有锁定JVM必须不支持的标识.锁定的引用可以被删除并在以后被另一个替换,这使得释放锁定毫无意义并将导致死锁).

但我不知道序列化如何发挥作用.为什么它被认为是"身份敏感机制"?为什么它"以对象为基础进行基于身份的区分"

java serialization java-8

18
推荐指数
2
解决办法
3031
查看次数

Java 8 Stream分组

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>>

java lambda java-8

18
推荐指数
2
解决办法
3万
查看次数

Java8为LocalDateTime添加时间不起作用

我尝试过如下,但在两种情况下它都显示同一时间?我做错了什么.

    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小时后"相同...

java-8 java-time

18
推荐指数
2
解决办法
2万
查看次数

在JSP EL中使用接口默认方法时,"在类型上找不到属性"

请考虑以下界面:

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)

- …

java jsp el java-8 default-method

18
推荐指数
1
解决办法
1887
查看次数

Android N Java8 java.time

我更新到最新的Android N sdk.我唯一不理解的是为什么我无法导入java.time我的代码?我认为Java8可以通过Android N获得.那么为什么谷歌没有添加java.time包?

android java-8 java-time android-7.0-nougat

18
推荐指数
4
解决办法
7326
查看次数

Comparator.comparing(...)嵌套字段

假设我有一个这样的域模型:

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()在模型上添加方法.

java lambda comparator java-8

18
推荐指数
2
解决办法
1万
查看次数

Java 8 Streams:计算进入终端操作的所有元素

我想知道是否有更好的(或只是其他)方法来获取进入流的终端操作而不是以下的所有项的计数:

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 java-8 java-stream

18
推荐指数
1
解决办法
2632
查看次数

LocalDate.plus错误答案

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)

java java-8 off-by-one localdate

18
推荐指数
2
解决办法
355
查看次数