小编rom*_*oll的帖子

Java8 Lambdas和Exceptions

我想知道是否有人可以向我解释以下奇怪之处.我正在使用Java 8更新11.

鉴于这种方法

private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
   return fun.apply(opt) ;
}
Run Code Online (Sandbox Code Playgroud)

如果我首先构造一个函数Object,并将其传递给上面的方法,那么事情就会编译.

private void doesCompile() {
    Function<Optional<String>, String> fun = o -> o.orElseThrow(() -> new RuntimeException("nah"));
    runFun(fun, Optional.of("foo"));

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将函数内联为lambda,编译器会说

未报告的例外X; 必须被抓住或宣布被抛出

private void doesNotCompile () {
    runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
}
Run Code Online (Sandbox Code Playgroud)

更新:原来错误消息由maven缩写.如果直接用javac编译,则错误是:

error: unreported exception X; must be caught or declared to be thrown
            runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
                                     ^
  where X,T are type-variables:
    X extends Throwable declared …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

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

Log4j格式化:是否可以截断堆栈跟踪?

我想在我的程序中只记录Exceptions的前几行.我知道,我可以做这样的事情只打印堆栈跟踪的前5行:

Throwable e = ...;
StackTraceElement[] stack = e.getStackTrace();
int maxLines = (stack.length > 4) ? 5 : stack.length;
for (int n = 0; n < maxLines; n++) {
    System.err.println(stack[n].toString());
}
Run Code Online (Sandbox Code Playgroud)

但我宁愿使用log4j(或更精确的log4j上的slf4j)进行日志记录.有没有办法告诉log4j它应该只打印堆栈跟踪的前5行?

java logging log4j stack-trace

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

与JavaScript相比,TypeScript提供了哪些额外的功能编程功能?

我有兴趣学习TypeScript,但前提是我可以使用它进行功能编码,并尽可能避免使用命令/ OOP.

TypeScript是否通过更好地支持函数式编程的基本JavaScript添加功能?这些是什么?

functional-programming typescript

20
推荐指数
1
解决办法
4379
查看次数

未经过滤的:何时选择netty

我在未经过滤的情况下进行了快速测试,比较了jetty和netty作为底层连接处理程序的吞吐量.只需提供(内存缓存)映像并对其进行负载测试.我的发现是性能没有显着差异.

除此之外,我的印象是两者都具有类似的缩放功能,例如暂停连接.

此外,未经过滤的非常友好,可以为我们提供与两个框架非常相似(如果不是相同的)接口,因此您无法真正说一个更容易使用另一个.

所以我想知道,为什么未经过滤的人会给我们这两个选择呢?是否有任何情况下你会选择netty over jetty(或相反的方式)?

scala jetty netty unfiltered

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

java中符合PMD的流复制

我有一段用于流复制的代码。

OutputStream os = ...;
InputStream is = ...;
int bufferLength;
byte[] buffer = new byte[1024];
while ((bufferLength = is.read(buffer)) != -1) {
   os.write(buffer, 0, bufferLength);
}
Run Code Online (Sandbox Code Playgroud)

如果我在它上面运行 PMD,我会收到以下警告http://pmd.sourceforge.net/rules/controversial.html#AssignmentInOperand

现在我希望摆脱那个警告,但我能想到的唯一选择是

OutputStream os = ...;
InputStream is = ...;
int bufferLength;
byte[] buffer = new byte[1024];
bufferLength = is.read(buffer);
while (bufferLength != -1) {
   os.write(buffer, 0, bufferLength);
   bufferLength = is.read(buffer);
}
Run Code Online (Sandbox Code Playgroud)

我真的不喜欢那样,因为我最终会复制代码。有没有更优雅的方式来满足这个 PMD 规则?

java pmd while-loop

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

如何匹配路由中的特定接受标头?

我想创建一个仅在客户端发送特定Accept标头时才匹配的路由.我用Spray 1.2-20130822.

我想让路线工作:

def receive = runRoute {
    get {
      path("") {
        accept("application/json") {
           complete(...)
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

在这里,我发现了一个使用accept()函数的规范,但是我无法弄清楚要在我的Spray-Handler中导入什么来使它作为指令工作.另外,我没有找到关于头指令的其他doc但是这些存根.

scala spray

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

迭代Option实例,直到找到第一个非空

我有许多返回Option值的函数,就像这样

case class A()
case class B() 
case class C()

def optionA(): Option[A] = None
def optionB(): Option[B] = Some(B())
def optionC(): Option[C] = Some(C())
Run Code Online (Sandbox Code Playgroud)

我想要做的是,我想按顺序运行这些函数,但只有在其中一个函数返回Option带有值(a Some)的函数之前.然后我希望返回该值,而不运行其余的函数.

这是我目前的实施

val res:Option[Any] = Stream(
  () => optionA(),
  () => optionB(),
  () => optionC()
) .map(f => f())
  .filter(opt => opt.isDefined)
  .head
Run Code Online (Sandbox Code Playgroud)

对于上述功能的实现,适用optionAoptionB,给了我一个Some(B()),而且也从未运行optionC,这是我想要的.

但我想知道是否有更好/简单/替代的实施.

有点像val findFirst = optionA compose optionB compose optionC

functional-programming scala

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

case类返回Product而不是实际类型

我有一个特质和一些案例类来扩展这个特性.

sealed trait Bird
case class Eagle(age: Int) extends Bird
case class Sparrow(price: Double) extends Bird
Run Code Online (Sandbox Code Playgroud)

如果我做任何我希望将Trait作为类型返回的东西,比如

val result = "test" match {
  case s:String if s startsWith "t" => Eagle(5)
  case _ => Sparrow(2)
}
Run Code Online (Sandbox Code Playgroud)

我得到了这种Product类型.

> result: Product with Serializable with Bird = Eagle(5)
Run Code Online (Sandbox Code Playgroud)

我理解Product所有案例类都是扩展的.但我不知道该怎么办Product,我怎么能得到Bird甚至Eagle回来呢?

scala case-class

0
推荐指数
1
解决办法
1039
查看次数