lambda具有多种效果

时间:2017-03-30 03:23:23

标签: lambda java-8

我有三个不同类的一些通用接口Bag。这些是具有一些属性的简单容器。我可以添加一些东西,例如int s。出于单元测试的目的,我想为每个Bag中的每一个添加一些值。所以我使用了以下IntConsumer

IntStream.rangeClosed(1, 300).forEach(new IntConsumer() {
    @Override
    public void accept(int value) {
        staticBag.add(value);
        shuffledBag.add(value);
        randomAccessBag.add(value);
        }
    });

我的问题是如何改变lambda表达式。 Intellij通常会自动更改这些内容,但此时它还没有向我显示任何提示。

3 个答案:

答案 0 :(得分:3)

Intellij为我做了!你走了:

IntStream.rangeClosed(1, 300).forEach(value -> {
    staticBag.add(value);
    shuffledBag.add(value);
    randomAccessBag.add(value);
});

答案 1 :(得分:2)

添加实用程序方法accept(IntConsumer),您可以使用IntConsumer.andThen链接函数。

IntStream.rangeClosed(1, 300).forEach(accept(staticBag::add)
                                     .andThen(shuffledBag::add)
                                     .andThen(randomAccessBag::add));

private IntConsumer accept(IntConsumer consumer) {
    return consumer;
}

或者添加实用程序方法accept(IntConsumer...)以使用Stream.reduce(BinaryOperator)组合所有消费者。

IntStream.rangeClosed(1, 300).forEach(accept(staticBag::add
                                     /**/, shuffledBag::add
                                     /**/, randomAccessBag::add));

private IntConsumer accept(IntConsumer... consumers) {
    IntConsumer nothing = (value) -> { };
    return Arrays.stream(consumers).reduce(IntConsumer::andThen).orElse(nothing);
}

答案 2 :(得分:1)

这个怎么样:

IntStream.rangeClosed(1, 300)
  .peek(staticBag::add)
  .peek(shuffledBag::add)
  .forEach(randomAccessBag::add);