7

寻找如何使用 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++);
    }
}

此示例中的消费者已大大简化,可用于在 StackOverflow 上发布。

4

3 回答 3

6

您可以这样做,使用 Java9 中添加的新功能。

Stream.generate(keyGen).takeWhile(Objects::nonNull).forEach(consumer);
于 2018-12-19T05:29:30.963 回答
5

您可以使用Stream

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

Stream.generate将创建一个持续调用get提供的供应商的流。

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

于 2018-12-19T05:18:22.440 回答
5

试试这个

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);
于 2018-12-19T05:29:42.723 回答