我想知道是否有人可以向我解释以下奇怪之处.我正在使用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) 我想在我的程序中只记录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行?
我有兴趣学习TypeScript,但前提是我可以使用它进行功能编码,并尽可能避免使用命令/ OOP.
TypeScript是否通过更好地支持函数式编程的基本JavaScript添加功能?这些是什么?
我在未经过滤的情况下进行了快速测试,比较了jetty和netty作为底层连接处理程序的吞吐量.只需提供(内存缓存)映像并对其进行负载测试.我的发现是性能没有显着差异.
除此之外,我的印象是两者都具有类似的缩放功能,例如暂停连接.
此外,未经过滤的非常友好,可以为我们提供与两个框架非常相似(如果不是相同的)接口,因此您无法真正说一个更容易使用另一个.
所以我想知道,为什么未经过滤的人会给我们这两个选择呢?是否有任何情况下你会选择netty over jetty(或相反的方式)?
我有一段用于流复制的代码。
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 规则?
我想创建一个仅在客户端发送特定Accept标头时才匹配的路由.我用Spray 1.2-20130822.
我想让路线工作:
def receive = runRoute {
get {
path("") {
accept("application/json") {
complete(...)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我发现了一个使用accept()函数的规范,但是我无法弄清楚要在我的Spray-Handler中导入什么来使它作为指令工作.另外,我没有找到关于头指令的其他doc但是这些存根.
我有许多返回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)
对于上述功能的实现,适用optionA和optionB,给了我一个Some(B()),而且也从未运行optionC,这是我想要的.
但我想知道是否有更好/简单/替代的实施.
有点像val findFirst = optionA compose optionB compose optionC?
我有一个特质和一些案例类来扩展这个特性.
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 ×4
java ×3
case-class ×1
java-8 ×1
jetty ×1
lambda ×1
log4j ×1
logging ×1
netty ×1
pmd ×1
spray ×1
stack-trace ×1
typescript ×1
unfiltered ×1
while-loop ×1