2016-08-01 33 views
2

有没有任何方法可以在不编写代码或添加额外库的情况下使用链中的消费者? 现在是这样的:使用标准库一次多次应用消费者

Consumer s = str -> System.out.println(str); 
s.accept("abc"); 
s.accept("fgh"); 
s.accept("xyz"); 

有没有办法把它变成像

Consumer s = str -> System.out.println("str"); 
s.accept("abc").accept("fgh").accept("xyz") 

回答

1

正如其他人提到Consumer返回void所以你不能链他们。但一切都归结于你试图实现的事情有多复杂。比如你的具体的例子可能已经被写入这样的方式:

Stream.of("abc", "fgh", "xyz").forEach(System.out::println); 

字符串可以用任何物体来代替和Consumer可以是任意复杂的。但是,如果你不需要在一个链中的每个价值上执行消费者,那么这种方法将不适合你。

3

因为accept()返回void,你问什么是不可能“开箱”。 但是,你可以创建一些包装做你想做的。例如:

class ChainedConsumer<T> { 

    private final Consumer<T> consumer; 

    public ChainedConsumer(final Consumer<T> consumer) { 
     this.consumer = consumer; 
    } 

    public ChainedConsumer<T> accept(final T s) { 
     this.consumer.accept(s); 
     return this; 
    } 
} 
+0

我知道接受不会有帮助。但也许有一些标准的方法可以让我将消费者映射到应用消费者并返回自己的功能上? – maxpovver

+0

对不起,我纠正了我的问题 – maxpovver

1

如果环境允许做的Consumer的包装,你将能够创建自己的accept方法,从void改变签名Consumer并始终返回this作为建造者模式。