有没有办法forEach
在Java 8中构建一个使用索引进行迭代的方法?理想情况下,我喜欢这样的事情:
params.forEach((idx, e) -> query.bind(idx, e));
Run Code Online (Sandbox Code Playgroud)
我现在能做的最好的事情是:
int idx = 0;
params.forEach(e -> {
query.bind(idx, e);
idx++;
});
Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的场景,类型推断不起作用,因为我期望使用lambda表达式.这是我真实场景的近似值:
static class Value<T> {
}
@FunctionalInterface
interface Bar<T> {
T apply(Value<T> value); // Change here resolves error
}
static class Foo {
public static <T> T foo(Bar<T> callback) {
}
}
void test() {
Foo.foo(value -> true).booleanValue(); // Compile error here
}
Run Code Online (Sandbox Code Playgroud)
我在倒数第二行得到的编译错误是
对于Object类型,方法booleanValue()未定义
如果我将lambda转换为Bar<Boolean>
:
Foo.foo((Bar<Boolean>)value -> true).booleanValue();
Run Code Online (Sandbox Code Playgroud)
或者如果我更改方法签名Bar.apply
以使用原始类型:
T apply(Value value);
Run Code Online (Sandbox Code Playgroud)
然后问题就消失了.我期望它的工作方式是:
Foo.foo
call应该推断出一个返回类型 boolean
value
在lambda中应该推断出来Value<Boolean>
.为什么这个推理不能按预期工作?如何更改此API以使其按预期工作?
我正在尝试发布一个使用git作为SCM的多模块maven项目,我遇到的第一个问题是maven发布插件构建release.properties scm.url的方式.我的父POM看起来像这样:
<packaging>pom</packaging>
<groupId>org.project</groupId>
<artifactId>project-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scm>
<connection>scm:git:git://github.com/username/project.git</connection>
<developerConnection>scm:git:git@github.com:username/project.git</developerConnection>
<url>http://github.com/username/project</url>
</scm>
<modules>
<module>api</module>
<module>spi</module>
</modules>
Run Code Online (Sandbox Code Playgroud)
模块POM很简单:
<parent>
<groupId>org.project</groupId>
<artifactId>project-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>api</artifactId>
<version>0.2.2</version>
Run Code Online (Sandbox Code Playgroud)
我的目标是能够发布单个模块,因为它们各自具有不同的版本,并且我不希望每次发布时都将所有版本一起增加.
当我切换到api
目录并执行以下操作时,mvn release:clean release:prepare
我遇到了以下输出:
[INFO] Executing: cmd.exe /X /C "git push git@github.com:username/project.git/api master:master"
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Unable to commit files
Provider message:
The git-push command failed.
Command output:
ERROR: Repository not found.
Run Code Online (Sandbox Code Playgroud)
看起来maven发布插件通过将模块名称附加到其上来创建scm.url developerConnection
,这最终不是github上的有效存储库.我不确定设置它的正确方法是什么.可能是Maven + git +发布单个子模块根本不起作用的情况?任何输入都表示赞赏.
我在里面有一些代码pre
和code
标签在我想要水平滚动的引导容器中.这通常很好,直到我为我的页面添加一个flexbox body
才能完成粘性页脚.此后,code
当页面较窄时(例如移动查看),不再水平滚动.
这是我的代码(请注意,code
当您缩小窗口时,水平滚动条会消失):
html, body {
height: 100%;
}
body {
min-height: 100%;
display: flex;
flex-direction: column;
}
code {
max-height: 200px;
background-color: #eeeeee;
word-break: normal !important;
word-wrap: normal !important;
white-space: pre !important;
}
.flexer {
flex: 1;
}
footer {
background-color: #CCC;
}
Run Code Online (Sandbox Code Playgroud)
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/>
<div class="container">
<div class="row">
<div class="col-md-12 docs">
<p>Some sample code</p>
<pre><code>Loading mirror speeds from cached hostfilebase: mirrors.arpnetworks.com * centosplus: mirrors.arpnetworks.com* extras:mirrors.arpnetworks.com*rpmforge: mirror.hmc.eduupdates: mirrors.arpnetworks.comExcluding Packages …
Run Code Online (Sandbox Code Playgroud)我正在玩Java 8并且遇到了一个基本场景,它说明了修复一个编译错误导致另一个编译错误的问题22.场景(这只是一个从更复杂的东西中简化的例子):
public static List<String> catch22(List<String> input) {
List<String> result = null;
if (input != null) {
result = new ArrayList<>(input.size());
input.forEach(e -> result.add(e)); // compile error here
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我收到编译错误:
在封闭范围内定义的局部变量结果必须是最终的或有效的最终结果
如果我将第一行更改为:
List<String> result;
Run Code Online (Sandbox Code Playgroud)
我在最后一行收到编译错误:
局部变量结果可能尚未初始化
似乎这里唯一的方法是将我的结果预初始化为ArrayList,我不想这样做,或者不使用lambda表达式.我错过了任何其他解决方案吗?
我很难理清为什么lambda表达式可以分配给某些功能接口,而不是其他功能接口.例如,使用Metrics库中的一些功能接口:
Gauge<Double> foo = () -> { return null; };
RatioGauge bar = () -> { return null; };
Run Code Online (Sandbox Code Playgroud)
第二个语句有一个编译错误(在Eclipse中):
此表达式的目标类型必须是功能接口
据我所知,RatioGauge是一个功能界面.我错过了什么吗?
使用IntelliJ IDEA 15时,只要我的鼠标位于代码窗口中的任何位置(来自第三方jar),我就会得到这些常量且烦人的文档弹出窗口.它将为任何变量/方法/类/任何碰巧在我的鼠标附近弹出文档.如果我的鼠标不在任何代码行附近,它将弹出当前的类文件,所以基本上我不能浏览代码,除非我将鼠标移动到另一个窗口.
它只发生在反编译的类中,而不是我的普通代码.我该如何阻止这些?
我正在尝试使用方法引用来捕获方法调用,并且遇到了一些限制.这很好用:
<T> void capture(Function<T, ?> in) {
}
private interface Foo {
String getBar();
}
capture(Foo::getBar);
Run Code Online (Sandbox Code Playgroud)
但是,如果我将Foo.setBar的签名更改为以下内容:
private interface Foo {
void setBar(String bar);
}
capture(Foo::setBar);
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Cannot make a static reference to the non-static method setBar(String) from the type MyTest.Foo
我不清楚限制是什么.理想情况下,我想使用方法引用来捕获标准setter上的调用.有没有办法做到这一点?
虽然Java 8的类型推断看起来有了很大的改进,但我遇到了一个可能的限制,我不确定是否有一些我缺少的解决方法.场景:
class Foo<T> {
<U> void apply(Function<T, Consumer<U>> bar) {}
}
class Bar {
void setBar(String bar){}
}
Foo<Bar> foo = new Foo<>();
Run Code Online (Sandbox Code Playgroud)
这有效:
foo.<String>apply(bar -> bar::setBar);
Run Code Online (Sandbox Code Playgroud)
这不是:
foo.apply(bar -> bar::setBar);
Run Code Online (Sandbox Code Playgroud)
有没有办法让类型推断在这种情况下工作?