使用 Lambda 函数消费供应商提供的所有对象
Using Lambda functions to Consume all objects provided by a Supplier
寻找如何使用 Java lambda 函数,以便消费者可以处理供应商提供的所有对象,并摆脱显式 while
循环和 null
检查。
我有一个数据库的字符串键供应商,我想使用一个消费者来处理这些键中的每一个。
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 已大大简化,以便在 Whosebug 上发布。
您可以使用 Stream
:
Stream.generate(keyGen).limit(NumKeys).forEach(consumer);
Stream.generate
将创建一个持续调用 get
提供的供应商的流。
limit
使流有限,将其限制为 x 个元素。在这种情况下,我可以看到 keyGen
只会生成 NumKeys
键,所以我 "cut off" 从那一点开始的流。
您可以这样做,使用 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);
寻找如何使用 Java lambda 函数,以便消费者可以处理供应商提供的所有对象,并摆脱显式 while
循环和 null
检查。
我有一个数据库的字符串键供应商,我想使用一个消费者来处理这些键中的每一个。
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 已大大简化,以便在 Whosebug 上发布。
您可以使用 Stream
:
Stream.generate(keyGen).limit(NumKeys).forEach(consumer);
Stream.generate
将创建一个持续调用 get
提供的供应商的流。
limit
使流有限,将其限制为 x 个元素。在这种情况下,我可以看到 keyGen
只会生成 NumKeys
键,所以我 "cut off" 从那一点开始的流。
您可以这样做,使用 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);