使用Lambda函数消耗供应商提供的所有对象



寻找如何使用Java lambda函数,以便消费者可以处理供应商提供的所有对象,并摆脱显式的while循环和null检查。

我有一个数据库的字符串键供应商,我想使用一个Consumer来处理这些键中的每一个。

Supplier<String> keyGen = new SimpleKeySupplier(keyPrefix, numKeys);
Consumer<String> consumer = (String key) -> System.out.println("key="+key);

我希望consumer处理keyGen提供的每个密钥,并尝试了以下操作。它是有效的,但我确信必须有一种更简洁的方法来使用lambda函数,使其更简单。

// Test that the correct keys have been populated.
Supplier<String> keyGen = new SimpleKeySupplier(keyPrefix, NumKeys);
String k = keyGen.get();
while(k != null) {
consumer.accept(k);
k = keyGen.get();
}

SimpleKeySupplier工作,简化版本如下:

import java.util.function.Supplier;
public class SimpleKeySupplier implements Supplier<String> {
private final String keyPrefix;
private final int numToGenerate;
private       int numGenerated;
public SimpleKeySupplier(String keyPrefix, int numRecs) {
this.keyPrefix = keyPrefix;
numToGenerate  = numRecs;
numGenerated   = 0;
}
@Override
public String get() {
if (numGenerated >= numToGenerate) 
return null; 
else   
return (keyPrefix + numGenerated++);
}
}

本例中的Consumer在StackOverflow上的发布大大简化了。

通过在Java9中添加新功能,您可以这样做。

Stream.generate(keyGen).takeWhile(Objects::nonNull).forEach(consumer);

试试这个

Supplier<String> keyGen = new SimpleKeySupplier(keyPrefix, numKeys);
Consumer<String> consumer = (String key) -> System.out.println("key="+key);
Stream.generate(keyGen).filter(s -> s !=null).limit(NumKeys).forEach(consumer);

您可以使用Stream:

Stream.generate(keyGen).limit(NumKeys).forEach(consumer);

Stream.generate将创建一个流,该流在所提供的供应商上不断调用get

limit使得流是有限的,将其限制为x个元素。在这种情况下,我可以看到keyGen只会生成NumKeys密钥,所以我从那一点"切断"了流。

最新更新