lambda - 使用 Lambda 函数使用供应商提供的所有对象

标签 lambda java-stream java-9 consumer supplier

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

我有一个数据库字符串键的供应商,我想使用消费者来处理每个键。

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

我要 consumer处理 keyGen 提供的每个 key 并尝试了以下方法。它有效,但我确信必须有一种更简洁的方法来使用 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);

关于lambda - 使用 Lambda 函数使用供应商提供的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53844760/

相关文章:

c++ - 错误 "lambda is not derived from ' std::function'

c++ - 在 lambda 表达式中,通过 [&captured] 和 [&local = captured] 捕获有什么区别?

java - 如何流式传输一系列 BigIntegers?

java - 为什么我的 `Stream` 在运行时被关闭?

java - 对 Java 8 流进行分区

android - 非法反射访问操作

Java 8 使用 Lambda/方法引用动态

java - 哪个版本的 Java 可与 Liquibase Maven 插件配合使用?

java - List.of 和 A​​rrays.asList 有什么区别?

c++ - 通过 lambda 定义的 constexpr 递归函数