小编Tom*_*bel的帖子

更清洁的元组组

我有一系列键值对(String,Int),我想按键将它们分组为一系列值(即Seq[(String, Int)]) => Map[String, Iterable[Int]])).

显然,toMap这里没用,并将groupBy值保持为元组.我设法得到的最好的是:

val seq: Seq[( String, Int )]
// ...
seq.groupBy( _._1 ).mapValues( _.map( _._2 ) )
Run Code Online (Sandbox Code Playgroud)

这样做有更干净的方法吗?

scala scala-collections

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

为什么Scala在嵌套类型参数时不能完全推断类型参数?

请考虑以下Scala代码:

abstract class A
abstract class B[T <: A]
class ConcreteA extends A
class ConcreteB extends B[ConcreteA]

class Example[U <: B[T], T <: A]( resolver: U )
object Test {
    new Example( new ConcreteB )
}
Run Code Online (Sandbox Code Playgroud)

最后一行new Example( new ConcreteB )无法编译,出现以下错误:

错误:推断类型参数[ConcreteB,Nothing]不符合类Example的类型参数bounds [U <:B [T],T <:A]

但是ConcreteB有解决U T的所有必要数据.我在这里缺少什么?

scala

13
推荐指数
2
解决办法
6488
查看次数

如何在Scala中证明两种类型没有子类型关系?

(注意:这需要一个漫长而艰难的解释;你可以找到关于这个Accord问题的完整讨论.它甚至可能不是解决问题的正确方法,但我相信这个问题本身很有趣.)

我正在寻找一种实现二元运算符的方法,使得行为取决于右侧操作数的类型:如果它与左侧操作数相同则为一种行为,否则为不同的行为.举个例子:

implicit class Extend[T](lhs: T) {
  def testAgainst(rhs: T) = println("same type")
  def testAgainst[U](rhs: U) = println("different type")
}
Run Code Online (Sandbox Code Playgroud)

第一个重载比第二个重载更具体,所以你会期望一个调用,比如5 testAgainst 10触发第一个重载,而5 testAgainst "abcd"调用第二个重载.虽然这在理论上是有意义的,但这不会编译,因为擦除的签名对于两个重载都是相同的.

我设法以一种需要在第一次重载中添加类型参数的方式来解决这个问题,但这正是我想要避免的.另一种解决方案是修改泛型重载,以要求编译器证明类型之间没有子类型关系(=:=不幸的是,Scala库没有提供).

虽然在Scala中编码子类型关系通常很容易,但我发现没有办法对其缺失进行编码.有没有什么办法要求,对于第二个重载是在编译时的候选人,无论T <:< U或者T >:> U是真的吗?

types scala

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

是否有一个强大的syslog的java.util.logging处理程序实现?

我正在考虑将第三方Java应用程序连接到我们的日志聚合/分析解决方案(可能是Splunk,但我们还没有完成我们的选择).将Splunk代理挂钩到syslog似乎是最容易的,所以我正在寻找一种方法将应用程序日志重定向到服务器上的本地syslog守护程序.

Java应用程序使用java.util.logging,遗憾的是它没有开箱即用的syslog处理程序(我相信log4j确实如此).有没有经过验证的库可以做到这一点?日志负载不是很大(每个进程大概每分钟10-20条消息,每个主机最多6个进程)但是我关注可靠性和持久性(例如当守护进程停止时会发生什么?...).

任何帮助,将不胜感激...

java logging syslog java.util.logging

6
推荐指数
1
解决办法
6047
查看次数

源代码控制中多语言项目的合理结构是什么?

在工作中,我们正在开发一个包含大量前端、后端和支持组件的大型应用程序。通常,前端是用 C# 开发的,后端是用 Java 开发的,尽管部分后端也是用 C# 开发的,也可能是后来的 C++。

语言和平台的选择不是任意的;我们尝试权衡每个组件在开发时间、工具链成本、特定开发团队对语言的熟悉程度等方面的相对优点。 然而,所有这些组件的共同点是,它们都是完整操作所必需的产品,并且它们由独立(但高度沟通)的团队同时开发。

以前,我们对 .NET 代码使用 Team Foundation Server,对 Java 代码使用 Subversion;由于团队职责明确分离,因此除了将一个源代码树生成的二进制文件(在本例中为 WAR)放置在另一个源代码树中的不便之外,几乎没有什么问题,以及保持分支和修订同步的高额手动开销。在这个项目中,团队之间的分离程度故意要小得多,并且分支/合并的数量预计要高得多;因此,我们正在转向统一的 VCS,更具体地说是 Subversion。

这让我想到了一个问题:如何有效地混合 Java 和 C# 代码?实际上,我们将拥有依赖于 Java 代码库的 .NET 代码;Java 二进制文件需要运行单元测试代码以外的任何东西(集成测试已经需要二进制文件,而 QA、验收测试等当然也需要)。我们目前想到的是:

/树干
    /java
        /组件1
        /组件2
        /图书馆1
        /图书馆2
    /网
        /组装1
        /组装2
        /...
        项目.sln

这个想法是将整个源代码树放在一个分支下;.NET 代码依赖于 Java 代码,因此我们将向解决方案添加一个构建后步骤,该步骤将(最有可能)调用 Java 组件的 ant 脚本。这允许分支整个代码库(对于 .NET 开发人员)或仅 Java 组件(对于 Java 开发人员)。

这个解决方案的问题是:

  1. 当两个代码库之一变得如此之大以至于为每个分支制作它的副本变得不切实际时会发生什么?(我们的想法:拆分为.NET和Java代码和使用SVN单独的存储库:外部组件,在此任何输入将大大赞赏)。
  2. 我们使用 Eclipse 进行 Java 开发。我们如何管理“共享”工作空间(即哪些项目需要哪些组件、依赖关系图等)?到目前为止,我们拥有的 Java 组件相对较少,因此每个开发人员可以同时将所有这些组件保留在工作区中。随着 Java 组件和 Java 开发人员的增加,我不知道我们如何继续这样做;关于如何在保持两个代码库之间同步的同时保持工作区版本化(解决方案文件)的任何建议?

我很想听听您的意见!

version-control projects-and-solutions monorepo

5
推荐指数
1
解决办法
2641
查看次数

使用Ant生成逗号分隔的文件列表

我正在尝试在当前目录下创建以逗号分隔的文件或目录列表.例如,假设我有以下文件夹结构:

Root
-- Directory1
-- Directory2
...

我想生成一个包含"Directory1,Directory2"的变量或属性.我尝试迭代(使用ant-contrib"for"任务)而不是a <dirset dir="." includes="*">,但这会生成绝对路径; 然后我使用"basename"任务提取文件名,但这又生成了一个输出属性.由于属性是不可变的,我在实践中得到的是"Directory1,Directory1,......"

有没有更好的方法来做到这一点,还是我必须编写Java扩展来为我做这个?

java ant

5
推荐指数
1
解决办法
7028
查看次数