Использование лямбда-функций для потребления всех объектов, предоставленных поставщиком - PullRequest
0 голосов
/ 19 декабря 2018

Ищите, как использовать лямбда-функции Java, чтобы Потребитель мог обрабатывать все объекты, предоставленные Поставщиком, и избавиться от явных циклов while и null проверок.

У меня есть Поставщик строкиключи для базы данных, и я хочу использовать Consumer для обработки каждого из этих ключей.

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

Я хочу, чтобы consumer обработал каждый ключ, предоставленный keyGen, и попробовал следующее.Это работает, но я уверен, что должен быть более краткий способ использования лямбда-функций, чтобы сделать это проще.

    // 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 ]

0 голосов
/ 19 декабря 2018

Вы можете сделать это так, добавив новые возможности в Java9.

Stream.generate(keyGen).takeWhile(Objects::nonNull).forEach(consumer);
0 голосов
/ 19 декабря 2018

Попробуйте это

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);
0 голосов
/ 19 декабря 2018

Вы можете использовать Stream:

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

Stream.generate создаст поток, который продолжает вызывать get на предоставленном поставщике.

limit делает потокконечно, ограничивая его до х элементов.В этом случае я вижу, что keyGen будет генерировать только ключи NumKeys, поэтому я «обрезаю» поток с этой точки.

...