小编Jos*_*one的帖子

带有索引的Java 8 forEach

有没有办法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)

java foreach for-loop java-8

129
推荐指数
3
解决办法
18万
查看次数

为什么此类型推断不适用于此Lambda表达式方案?

我有一个奇怪的场景,类型推断不起作用,因为我期望使用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以使其按预期工作?

java lambda type-inference java-8

38
推荐指数
2
解决办法
6697
查看次数

使用Git发布多模块maven项目

我正在尝试发布一个使用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 +发布单个子模块根本不起作用的情况?任何输入都表示赞赏.

git github maven

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

Flexbox与水平预/代码滚动的兼容性

我在里面有一些代码precode标签在我想要水平滚动的引导容器中.这通常很好,直到我为我的页面添加一个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)

html css css3 flexbox

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

Java 8使用lambda表达式捕获22并且有效地最终

我正在玩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表达式.我错过了任何其他解决方案吗?

java java-8

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

Java 8中的功能接口

我很难理清为什么lambda表达式可以分配给某些功能接口,而不是其他功能接口.例如,使用Metrics库中的一些功能接口:

Gauge<Double> foo = () -> { return null; };
RatioGauge bar = () -> { return null; };
Run Code Online (Sandbox Code Playgroud)

第二个语句有一个编译错误(在Eclipse中):

此表达式的目标类型必须是功能接口

据我所知,RatioGauge是一个功能界面.我错过了什么吗?

java java-8 codahale-metrics

9
推荐指数
1
解决办法
6534
查看次数

如何在IntelliJ IDEA中停止恼人的文档弹出窗口

使用IntelliJ IDEA 15时,只要我的鼠标位于代码窗口中的任何位置(来自第三方jar),我就会得到这些常量且烦人的文档弹出窗口.它将为任何变量/方法/类/任何碰巧在我的鼠标附近弹出文档.如果我的鼠标不在任何代码行附近,它将弹出当前的类文件,所以基本上我不能浏览代码,除非我将鼠标移动到另一个窗口.

它只发生在反编译的类中,而不是我的普通代码.我该如何阻止这些?

intellij-idea

9
推荐指数
4
解决办法
1612
查看次数

Java 8中静态方法引用的限制

我正在尝试使用方法引用来捕获方法调用,并且遇到了一些限制.这很好用:

<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 java-8 method-reference

7
推荐指数
2
解决办法
3153
查看次数

使用lambda表达式键入推理限制

虽然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)

有没有办法让类型推断在这种情况下工作?

java lambda type-inference java-8

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

如何使用ASM读取lambda表达式字节码

如何使用ASM从lambda表达式的主体中读取字节码指令?

java java-bytecode-asm

7
推荐指数
2
解决办法
1380
查看次数