我有以下代码,它们对List中的每个元素进行递归操作
def doMatch(list: List[Int]): Unit = list match {
case last :: Nil => println("Final element.")
case head :: tail => println("Recursing..."); doMatch(tail)
}
Run Code Online (Sandbox Code Playgroud)
现在,忽略通过filter()和foreach()可以使用此功能,这可以正常工作.但是,如果我尝试将其更改为接受任何Seq [Int],我会遇到问题:
以下是我认为代码的外观,除非它不起作用:
def doMatch(seq: Seq[Int]): Unit = seq match {
case last +: Seq() => println("Final element.")
case head +: tail => println("Recursing..."); doMatch(tail)
}
Run Code Online (Sandbox Code Playgroud)
编辑:这么多好的答案!我接受了agilesteel的答案,因为他是第一个注意到::在我的例子中不是运算符,而是一个案例类,因此差异.
我有一个实体,它与另一个用@Where注释的实体有关联,就像这样
public class EntityA {
@OneToMany
@Where(...)
private List<EntityB> entityBList;
}
Run Code Online (Sandbox Code Playgroud)
最近不可避免的事情发生了,我需要加载不符合@Where子句的EntityB.我可以删除@Where注释,但它被大量使用,所以理想情况下我不想这样做.除了手动加载EntityB的列表,还有另一个查询,我的选择是什么?我可以告诉Hibernate忽略@Where注释吗?
关于Scala中的yield命令和以下示例:
val values = Set(1, 2, 3)
val results = for {v <- values} yield (v * 2)
Run Code Online (Sandbox Code Playgroud)
PS.我知道这个例子没有遵循推荐的功能方式(也就是使用map),但它只是一个例子.
为JSF Web应用程序实现身份验证和授权的最佳方法是什么?我还是希望使用基于容器的安全性,因为我需要调用需要主体的EJB.
我意识到基于表单的身份验证是与JSF的一次重大斗争,但是我可以使用PhaseListener或类似的程序登录来验证用户吗?
我还应该看看其他任何方法吗?
Hibernate提供(至少)两个选项来解决N + 1查询问题.一个是将FetchMode设置为Subselect,它在该IN子句中生成带有IN子句和子选择的选择.另一种是指定BatchSize,它生成一个带有包含父项ID的IN子句的select.
两者都有效但我发现Subselect选项经常遇到性能问题,因为查询父项很复杂.另一方面,使用大型BatchSize(比如1000),查询的数量和这些查询的复杂性非常小.
我的问题是:你何时会在BatchSize上使用Hibernate的Subselect FetchMode?如果您有非常多的父条目(数千),则子选择可能有意义,但是在其他任何情况下您更喜欢Subselect到BatchSize吗?
编辑:我注意到在处理急切加载时两者之间存在差异.如果您将xToMany关联设置为热切地并通过子选择加载,则会生成一个子选择,就像它是懒惰一样.但是,如果指定BatchSize,则生成的查询将使用外部联接而不是单独的查询.有没有办法迫使Hibernate在急切加载时使用单独的批量查询?
我最近与同事讨论过是否应该允许将null或空集合作为方法参数传递.我的感觉是,这会导致异常,因为它会破坏方法的"契约",即使它不一定会破坏方法的执行.这也具有"快速失败"的优点.我的同事辩称,这会导致代码乱丢"非空/非空"检查,即使它不重要.
我可以看到他的观点,但允许空或空参数让我感到不安.它可以通过延迟失败来隐藏问题的真正原因!
我们来看两个具体的例子:
1)鉴于我们有一个带有重叠(Interval)方法的Interval类,如果将null作为参数传递会发生什么?我的感觉是我们应该抛出一个IllegalArgumentException来让调用者知道某些东西可能是错误的,但我的同事觉得返回false是足够的,就像在他使用它的场景中一样,如果第二个Interval是是否为空(重要的是它们是否重叠).
2)给定一个像fetchByIds(Collection ids)这样的方法,如果提供一个空集合会发生什么?再一次,我想警告打电话者发生了异常情况,但我的同事只是收到一个空列表就好了,因为他再一次并不关心是否有任何ids.
被叫代码的责任在哪里结束?在这两种情况下,调用代码都不介意参数是null还是空,但在其他情况下,这可能指向可能的错误.一个方法是否只保证只要遵守先决条件就不会破坏,或者它是否应该尝试识别潜在的错误调用?
编辑:我看到了很多很好的答案,大多数人倾向于将其定义为合同/在文档中,并坚持使用它,但我希望你的意见何时允许它,何时不允许(如果有的话).在具体的例子中,你会做什么?鉴于90%的用途,没有验证输入将是正常的,你仍然会验证清除剩余的10%中的错误,或者你宁愿解决那些出现的问题,并避免不必要的空/空检查?
我有一个网页,其中包含大约20-50个动态图像(从非静态源提供的图像).这些映像通过基于请求URL的servlet提供.这导致每个图像生成请求,这导致性能衰减.
如果这些图像是静态的,我会创建一个CSS精灵并用一个替换50个请求.因为它们是动态的,所以当然不是那么容易.我正在寻找一个工具/库/方法,我可以使用它来在运行时将这些图像聚合成一个精灵.幸运的是,图像大小是恒定的,对所有人来说都是一样的,这应该会使这更容易.
有什么建议?
我有Hibernate Entities看起来像这样(getters和setter被遗漏):
@Entity
public class EntityA {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private EntityB parent;
}
@Entity
public class EntityB extends SuperEntity {
@OneToMany(mappedBy = "parent")
@Fetch(FetchMode.SUBSELECT)
@JoinColumn(name = "parent_id")
private Set<EntityA> children;
}
@MappedSuperclass
public class SuperEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long itemId;
}
Run Code Online (Sandbox Code Playgroud)
当我查询EntityA时,它加载正常,父关联被Hibernate代理替换(因为它是Lazy).如果我想访问父母的id,我执行以下调用:
EntityA entityA = queryForEntityA();
long parentId = entityA.getParent().getItemId();
Run Code Online (Sandbox Code Playgroud)
据我所知,调用不应该向数据库进行往返,因为Id存储在EntityA表中,并且代理应该只返回该值.但是,在我的情况下,这将生成一个SQL语句,该语句提取EntityB,然后才返回Id.
我该如何调查这个问题?导致这种错误行为的可能原因是什么?
我需要在Java中动态创建异步消息队列.我的用例是通过多个SMTP服务器发送电子邮件:我需要按顺序强制执行相同SMTP服务器的电子邮件,但可以同时处理发送到不同SMTP服务器的电子邮件.我以前使用过JMS,但据我所知它只允许编译时队列创建,而我需要在运行时创建队列(每个SMTP服务器一个队列).
我是否遗漏了有关JMS的内容,或者是否有其他工具/建议我应该查看一下?
我有一组带有属性和一系列规则的对象,当应用于对象集时,它们提供了这些对象的子集.为了使这更容易理解,我将提供一个具体的例子.
我的对象是人,每个人都有三个属性:原籍国,性别和年龄组(所有属性都是离散的).我有一堆规则,比如"来自美国的所有男性",它们与这组较大的对象的子集相对应.
我正在寻找现有的Java"推理引擎"或类似的东西,它将能够从规则映射到一部分人,或者建议如何创建我自己的.我已阅读过规则引擎,但该术语似乎专门用于外部化业务规则的专家系统,通常不包括任何高级形式的推理.以下是我必须处理的更复杂场景的一些示例:
我需要规则的结合.因此,当提出"包括所有男性"和"排除10-20岁年龄组中的所有美国人"时,我只对美国以外的男性以及美国境内10岁以外的男性感兴趣 - 20岁年龄组.
规则可能有不同的优先级(明确定义).因此,"排除所有男性"的规则将覆盖"包括所有美国男性"的规则.
规则可能存在冲突.因此,我可以同时拥有"包括所有男性"和"排除所有男性",在这种情况下,优先级必须解决问题.
规则是对称的.所以"包括所有男性"相当于"排除所有女性".
规则(或更确切地说子集)可以具有与它们相关联的元规则(明确定义).必须在应用原始规则的任何情况下应用这些元规则,或者如果通过推理到达子集,则必须应用这些元规则.因此,如果"排除美国"的元规则附加到"包括所有男性"的规则,并且我向引擎提供"排除所有女性"的规则,那么它应该能够推断"排除所有女性"子集相当于"包括所有男性"子集,因此另外应用"排除美国"规则.
我很可能没有项目5,但我确实需要提到的所有其他属性.我的规则和对象都存储在数据库中,并且可以在任何阶段更新,因此我需要在需要时实例化"推理引擎"并在之后销毁它.
java ×4
hibernate ×3
collections ×2
scala ×2
annotations ×1
asynchronous ×1
css ×1
css-sprites ×1
html ×1
jaas ×1
jboss-mdb ×1
jms ×1
jsf ×1
lazy-loading ×1
logic ×1
null ×1
orm ×1
parameters ×1
proxy ×1
rule-engine ×1
rules ×1
sprite ×1
subquery ×1
where-clause ×1
yield ×1