小编Zec*_*tes的帖子

除列表之外的序列上的Scala模式匹配

我有以下代码,它们对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],我会遇到问题:

  • Seq没有::,但确实有+:,据我所知基本上是相同的.如果我尝试匹配head +:tail然而,编译器会抱怨'错误:找不到:value +:'
  • Nil是List特有的,我不知道该替换它.如果我遇到上一个问题,我将尝试Seq()

以下是我认为代码的外观,除非它不起作用:

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的答案,因为他是第一个注意到::在我的例子中不是运算符,而是一个案例类,因此差异.

collections scala pattern-matching

56
推荐指数
4
解决办法
4万
查看次数

忽略Hibernate @Where注释

我有一个实体,它与另一个用@Where注释的实体有关联,就像这样

public class EntityA {

    @OneToMany
    @Where(...)
    private List<EntityB> entityBList;

}
Run Code Online (Sandbox Code Playgroud)

最近不可避免的事情发生了,我需要加载不符合@Where子句的EntityB.我可以删除@Where注释,但它被大量使用,所以理想情况下我不想这样做.除了手动加载EntityB的列表,还有另一个查询,我的选择是什么?我可以告诉Hibernate忽略@Where注释吗?

annotations hibernate where-clause

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

Scala:从一种类型的集合到另一种集合

关于Scala中的yield命令和以下示例:

val values = Set(1, 2, 3)
val results = for {v <- values} yield (v * 2)
Run Code Online (Sandbox Code Playgroud)

  • 任何人都可以解释Scala如何知道要收集哪种类型的集合?我知道它是基于,但我如何编写复制产量的代码?
  • 我有什么办法可以改变收藏类型吗?在示例中,我希望结果List类型而不是Set类型.
  • 如果做不到这一点,从一个集合转换到另一个集合的最佳方法是什么?我知道_:*,但由于Set不是Seq,这不起作用.到目前为止我能找到的最好的是val listResults = List()++结果.

    PS.我知道这个例子没有遵循推荐的功能方式(也就是使用map),但它只是一个例子.

  • collections scala yield

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

    JSF身份验证和授权

    为JSF Web应用程序实现身份验证和授权的最佳方法是什么?我还是希望使用基于容器的安全性,因为我需要调用需要主体的EJB.

    我意识到基于表单的身份验证是与JSF的一次重大斗争,但是我可以使用PhaseListener或类似的程序登录来验证用户吗?

    我还应该看看其他任何方法吗?

    java authentication jsf authorization jaas

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

    Hibernate Subselect与批量提取

    Hibernate提供(至少)两个选项来解决N + 1查询问题.一个是将FetchMode设置为Subselect,它在该IN子句中生成带有IN子句和子选择的选择.另一种是指定BatchSize,它生成一个带有包含父项ID的IN子句的select.

    两者都有效但我发现Subselect选项经常遇到性能问题,因为查询父项很复杂.另一方面,使用大型BatchSize(比如1000),查询的数量和这些查询的复杂性非常小.

    我的问题是:你何时会在BatchSize上使用Hibernate的Subselect FetchMode?如果您有非常多的父条目(数千),则子选择可能有意义,但是在其他任何情况下您更喜欢Subselect到BatchSize吗?

    编辑:我注意到在处理急切加载时两者之间存在差异.如果您将xToMany关联设置为热切地并通过子选择加载,则会生成一个子选择,就像它是懒惰一样.但是,如果指定BatchSize,则生成的查询将使用外部联接而不是单独的查询.有没有办法迫使Hibernate在急切加载时使用单独的批量查询?

    hibernate subquery select-n-plus-1

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

    我们应该允许null/empty参数吗?

    我最近与同事讨论过是否应该允许将null或空集合作为方法参数传递.我的感觉是,这会导致异常,因为它会破坏方法的"契约",即使它不一定会破坏方法的执行.这也具有"快速失败"的优点.我的同事辩称,这会导致代码乱丢"非空/非空"检查,即使它不重要.

    我可以看到他的观点,但允许空或空参数让我感到不安.它可以通过延迟失败来隐藏问题的真正原因!

    我们来看两个具体的例子:

    1)鉴于我们有一个带有重叠(Interval)方法的Interval类,如果将null作为参数传递会发生什么?我的感觉是我们应该抛出一个IllegalArgumentException来让调用者知道某些东西可能是错误的,但我的同事觉得返回false是足够的,就像在他使用它的场景中一样,如果第二个Interval是是否为空(重要的是它们是否重叠).

    2)给定一个像fetchByIds(Collection ids)这样的方法,如果提供一个空集合会发生什么?再一次,我想警告打电话者发生了异常情况,但我的同事只是收到一个空列表就好了,因为他再一次并不关心是否有任何ids.

    被叫代码的责任在哪里结束?在这两种情况下,调用代码都不介意参数是null还是空,但在其他情况下,这可能指向可能的错误.一个方法是否只保证只要遵守先决条件就不会破坏,或者它是否应该尝试识别潜在的错误调用?

    编辑:我看到了很多很好的答案,大多数人倾向于将其定义为合同/在文档中,并坚持使用它,但我希望你的意见何时允许它,何时不允许(如果有的话).在具体的例子中,你会做什么?鉴于90%的用途,没有验证输入将是正常的,你仍然会验证清除剩余的10%中的错误,或者你宁愿解决那些出现的问题,并避免不必要的空/空检查?

    parameters null code-contracts

    10
    推荐指数
    1
    解决办法
    863
    查看次数

    为动态图像生成CSS精灵

    我有一个网页,其中包含大约20-50个动态图像(从非静态源提供的图像).这些映像通过基于请求URL的servlet提供.这导致每个图像生成请求,这导致性能衰减.

    如果这些图像是静态的,我会创建一个CSS精灵并用一个替换50个请求.因为它们是动态的,所以当然不是那么容易.我正在寻找一个工具/库/方法,我可以使用它来在运行时将这些图像聚合成一个精灵.幸运的是,图像大小是恒定的,对所有人来说都是一样的,这应该会使这更容易.

    有什么建议?

    html css css-sprites sprite

    8
    推荐指数
    1
    解决办法
    2483
    查看次数

    Hibernate在访问关联实体的id时生成SQL查询

    我有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 orm proxy hibernate lazy-loading

    8
    推荐指数
    1
    解决办法
    3894
    查看次数

    在Java中动态创建异步消息队列

    我需要在Java中动态创建异步消息队列.我的用例是通过多个SMTP服务器发送电子邮件:我需要按顺序强制执行相同SMTP服务器的电子邮件,但可以同时处理发送到不同SMTP服务器的电子邮件.我以前使用过JMS,但据我所知它只允许编译时队列创建,而我需要在运行时创建队列(每个SMTP服务器一个队列).

    我是否遗漏了有关JMS的内容,或者是否有其他工具/建议我应该查看一下?

    java asynchronous jms message-queue jboss-mdb

    7
    推荐指数
    1
    解决办法
    8024
    查看次数

    推理引擎根据内部规则计算匹配集

    我有一组带有属性和一系列规则的对象,当应用于对象集时,它们提供了这些对象的子集.为了使这更容易理解,我将提供一个具体的例子.

    我的对象是人,每个人都有三个属性:原籍国,性别和年龄组(所有属性都是离散的).我有一堆规则,比如"来自美国的所有男性",它们与这组较大的对象的子集相对应.

    我正在寻找现有的Java"推理引擎"或类似的东西,它将能够从规则映射到一部分人,或者建议如何创建我自己的.我已阅读过规则引擎,但该术语似乎专门用于外部化业务规则的专家系统,通常不包括任何高级形式的推理.以下是我必须处理的更复杂场景的一些示例:

    1. 我需要规则的结合.因此,当提出"包括所有男性"和"排除10-20岁年龄组中的所有美国人"时,我只对美国以外的男性以及美国境内10岁以外的男性感兴趣 - 20岁年龄组.

    2. 规则可能有不同的优先级(明确定义).因此,"排除所有男性"的规则将覆盖"包括所有美国男性"的规则.

    3. 规则可能存在冲突.因此,我可以同时拥有"包括所有男性"和"排除所有男性",在这种情况下,优先级必须解决问题.

    4. 规则是对称的.所以"包括所有男性"相当于"排除所有女性".

    5. 规则(或更确切地说子集)可以具有与它们相关联的元规则(明确定义).必须在应用原始规则的任何情况下应用这些元规则,或者如果通过推理到达子集,则必须应用这些元规则.因此,如果"排除美国"的元规则附加到"包括所有男性"的规则,并且我向引擎提供"排除所有女性"的规则,那么它应该能够推断"排除所有女性"子集相当于"包括所有男性"子集,因此另外应用"排除美国"规则.

    我很可能没有项目5,但我确实需要提到的所有其他属性.我的规则和对象都存储在数据库中,并且可以在任何阶段更新,因此我需要在需要时实例化"推理引擎"并在之后销毁它.

    java logic rule-engine rules inference-engine

    7
    推荐指数
    1
    解决办法
    2244
    查看次数