我已经了解到Hibernate在为您提供查询结果时不返回实际实体类的实例,而是返回一个"代理"实例,该实例是从您的实际实体类中动态子类的.我理解这种行为的原因,因为它允许实现延迟初始化.但是,我对这些代理类的实现细节还有一些问题没有答案:
当我使用getter时,懒惰的获取字段是否会被加载?如果我在我的equals
或hashCode
方法中使用该字段该怎么办?这些方法的执行是否会导致NullPointerException
我之前没有调用此字段的getter?
Hibernate在触发初始化时如何初始化字段?它是否执行我在实体类中定义的字段的setter方法,还是通过反射或类似的方式将值直接赋值给变量?
我在使用Stream API找到一个好的方法/实现时遇到以下困难:
我有一个元素列表,每个元素由一个字符串和一个整数组成.现在我喜欢按字符串值对元素进行分组,然后对于每个组,我希望得到与该组相关的元素的整数值之和.
示例:我有以下3个要素:
("GroupA", 100) ("GroupA", 50) ("GroupB", 10)
Run Code Online (Sandbox Code Playgroud)
因此,我希望得到一个由以下两个(键,值)对组成的映射:
("GroupA, 150) ("GroupB, 10)
Run Code Online (Sandbox Code Playgroud)
我不知道如何解决这个问题.到目前为止我想出的最有希望的是:
elements.stream().collect(Collectors.groupingBy(e-> e.getGroup()))
.merge(group, elementsOfTheGroup, (...));
Run Code Online (Sandbox Code Playgroud)
但我不确定要插入哪个函数作为merge方法的最后一个参数.但我不知道我是否应该使用合并方法.
对此最优雅的实现是什么?
我正在使用REST API,因此我将不得不很快引入一些重大更改,因此需要v2。尽管仍并行支持v1,但仍需要几个月的时间,以便让我们的客户有时间在准备好新版本时切换到新的API。我们的API是通过共享云提供的,并且我们所有的客户都共享相同的系统后端,尤其是单个共享数据库。
我找到了很多有关REST API版本控制的文章,但它们更多是从客户端的角度或从高级设计的角度来看的。这并不是我真正关心的问题,我们的API已经在URI中提供了版本控制,因此提供带有/ v2基本路径的服务将不是问题。
但是我问自己,我将如何实际实现它,而我还没有真正找到好的文章。我真的不想分支我的项目的v2,然后将v1和v2分别构建和部署为单独的应用程序,因为那样的话,我将在两个应用程序中进行维护,错误修复,配置更改等,这是双重工作并且通常冗余的危险(即:版本之间可能存在不一致)。同样,v2当然在每个服务中也不相同,因此大多数代码仍将相同。
是否有关于如何在单个应用程序中技术地实现REST API的最佳实践,该应用程序向外部提供多个版本,并且在其中共享了一些代码(即:v2 / someService将在内部重定向到v1 / someService),而实际新服务中编码了差异?也许甚至还有一些框架可以帮助您设计?如果有帮助,该应用程序使用Spring MVC用Java编码。
感谢您提供有关解决此问题的提示或资源。谢谢!
更新:答案实际上在文档中:
注意:如果将可变对象用作set元素,则必须非常小心.如果在对象是集合中的元素的同时以影响等于比较的方式更改对象的值,则不指定集合的行为.
案件结案,谢谢大家!
编辑:关于散列集中重复项的引用主题确实有相同的观点,但是它没有回答我的问题:为什么文档没有说任何关于集合只能用于处理不可变对象?
edit2:我明白会发生什么.该组当然无法知道实体的哈希码何时在添加后发生变化.但问题是,文档应该清楚地说明set只能与不可变对象一起正常工作.
我已经用Java工作了5年多了,不要笑,但只是现在我才意识到套装的一些东西.我以为我理解了一套是什么,即文档说的是什么:
不包含重复元素的集合.更正式地说,集合*不包含任何元素
e1
和e2
*e1.equals(e2)
,并且最多只包含一个null元素.
但是,这完全不正确?!看这里:
public static void main(String[] args) {
Set<Entity> entitySet = new HashSet<>();
Entity e1 = new Entity("One");
Entity e2 = new Entity("Two");
entitySet.add(e1);
entitySet.add(e2);
e2.name = "One"; // !
System.out.println("Objects equal:" + e1.equals(e2));
Iterator<Entity> iterator = entitySet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
static class Entity {
String name;
Entity(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Entity)) { …
Run Code Online (Sandbox Code Playgroud) 所以我花了 2 个小时试图找到一个对我来说真正有意义的 Java 8 构造函数引用的实际示例。并不是我不理解构造函数引用的语法或语义。但我无法想出一个可以/将使用它们的用例。我发现的示例基本上只是引入了一个相当无意义的函数接口和一个匹配的类/构造函数,只是为了能够使用构造函数引用。但归根结底只是以一种new...()
非常复杂的方式做简单的事情。除了通过构造函数引用之外,函数式接口从未以任何其他方式使用过,那么有什么意义呢?
有人可以给我一个实际的例子,您可以使用构造函数引用来实现函数式接口,但是函数式接口不仅仅用于传递此构造函数引用,而且实际上有一个存在的理由,因为它与其他实现一起使用还有?
我想根据文本字段是否包含任何内容启用或禁用按钮,我想通过使用属性绑定来实现它.
所以一开始我在文本字段的text属性上使用了isEmpty()方法来为按钮的disabled属性创建一个布尔绑定:
startSearchButton.disableProperty().bind(searchField.textProperty().isEmpty());
Run Code Online (Sandbox Code Playgroud)
虽然绑定有效,但我对"文本字段包含任何内容"的定义与isEmpty()方法的定义不同,即只检查文本的长度是否为0.但是,我对是否存在"真实"文本感兴趣,即文本字段是否为空(不仅不是空的,而且实际上不仅仅是空格).
不幸的是没有方法isBlank(),我在Bindings实用程序类中也找不到任何合适的东西.现在我看到你可以通过Bindings.createBooleanProperty方法实现你喜欢的任何自定义布尔属性,但我还不熟悉定义自定义绑定的概念.我如何为我的案例实现这样的布尔属性?
我有一组任务,我们称之为T[]
,其中每个任务都T[i]
需要一定的时间t(T[i])
来处理。任务由线程并行处理X
(这并不意味着多个线程在单个任务上协同工作,而是多个线程正在处理多个任务,每个线程执行一个任务,然后执行下一个任务,依此类推) 。
现在我想计算处理所有任务所需的预期总时间。size(T[]) <= X
当然只要任务数小于或等于线程数就很容易,在这种情况下总时间等于最慢任务的时间。
但我对这种情况很迷茫X < size(T[])
(即我的线程比任务少)。如何以一种优雅的方式计算它?
编辑:正如评论员所问,我们可以假设任务队列按运行时间最长的任务排在前面,运行时间最短的任务排在最后。此外,我们可以假设任务之间没有暂停,我们也可以忽略操作系统调度程序正在做什么。
java ×4
aggregation ×1
algorithm ×1
closures ×1
constructor ×1
duplicates ×1
equals ×1
fetch ×1
group-by ×1
hibernate ×1
java-8 ×1
java-stream ×1
javafx ×1
math ×1
proxy ×1
rest ×1
set ×1
versioning ×1