当前位置: 首页 > 知识库问答 >
问题:

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

谷梁裕
2023-03-14

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

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

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

我想让消费者处理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上发布时大大简化。


共有3个答案

孔砚
2023-03-14

您可以使用Stream

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

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

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

易烨磊
2023-03-14

试试这个

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);
子车征
2023-03-14

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

Stream.generate(keyGen).takeWhile(Objects::nonNull).forEach(consumer);
 类似资料:
  • 对于Jcache配置,我们需要有通用的XML配置参数(如timetolive)<我们正在使用EhCache进行开发,并可能在其他环境中使用其他符合Jsr107的缓存提供程序,如Infinispan。 是否可以让两个缓存提供程序都使用一个配置文件,并且如果需要,我们只需要为不同的环境更改一些参数? 可以在属性文件中定义这些属性并使用它们根据配置文件初始化缓存管理器吗? 我浏览了jsr107留档,但没

  • 据甲骨文说,, 返回一个新的完全未来,该完全未来由ForkJoinPool.common池()中运行的任务异步完成,该任务的值通过调用给定的供应商获得。 静态CompletableFuture supplyAsync(供应商-供应商,执行者-执行者)返回一个新的CompletableFuture,该新的CompletableFuture由在给定执行者中运行的任务异步完成,其值通过调用给定供应商获得

  • 问题内容: 我如何在Supplier这里用lambda表达式替换代码 上面这段代码的输出是: 问题答案: 如果您必须专门使用以下内容: 编辑:使用IntStream.generate,您可以将其执行为 注意:就API设计而言,更好的解决方案肯定是利用这种用例。

  • 我使用的spring评估语言如下: 我的问题是bigMap中包含的大多数数据都没有被使用。相反,我更愿意通过将函数传递到求值上下文来延迟加载所需的内容,例如: 但我找不到如何做到这一点。有什么建议吗?

  • 我想用 使用请求构造函数参数的异常类型。类似这样的事情: 有没有一种方法可以创建一个供应商来传递我的参数值?