Java Lazy Stream of Strings包括List <string>

时间:2016-08-24 17:23:10

标签: java list java-stream lazy-evaluation

我为前两个简单的项目懒洋洋地创建了一串String。但是,我的部分流是List of String。

webpack-hook.js → "main" JS bundle
↓
./gui/html/index.html → file-loader → dist folder

上面的工作,但.getStringList也需要懒惰地调用。我不清楚如何获取它和&#34;合并&#34;它与流的其余部分一起。

3 个答案:

答案 0 :(得分:2)

我认为,你真正想做的是

protocol IndicatorProtocol {
    func printHello()
}

struct Indicator: IndicatorProtocol, StringLiteralConvertible, Equatable {
    let string: String
    init(name value: String) {
        self.string = value
    }

    init(stringLiteral value: String) {
        self.string = value
    }

    init(extendedGraphemeClusterLiteral value: String) {
        self.string = value
    }

    init(unicodeScalarLiteral value: String) {
        self.string = value
    }

    func printHello() {
        print("Hello from \(string)")
    }
}

func ==(left:Indicator, right:Indicator) -> Bool {
    return left.string == right.string

}

enum IndicatorA : Indicator {
    case One = "One", Two = "Two"
}

let test = IndicatorA.One

print(test.rawValue.printHello())   // prints "Hello from One

这会产生一个完全懒惰的return Stream.<Supplier<Stream<String>>>of( () -> Stream.of(item.getStringA()), () -> Stream.of(item.getStringB()), () -> item.getStringList(param).stream()) .flatMap(Supplier::get); ,例如Stream<String>不会在.limit(0).count()item上调用任何方法,只会调用.findFirst()等。

流的内容将等同于

getStringA()

答案 1 :(得分:1)

我认为这不符合你的想法。 Stream.generate 始终生成无限流。但最接近你想要的是

StreamSupport.stream(() -> item.getStringList(param).spliterator(), 0, false)

......懒惰地打电话给item.getStringList(param)。 (你想要的并不是Stream的预期用例,所以它得不到很好的支持。)

答案 2 :(得分:-1)

您可以做的是从Stream

返回item.getStringList()
public static void main(String[] args) throws InterruptedException {
    Item item = new Item();
    Stream<String> a = Stream.concat(Stream.of("A"), Stream.of("B"));

    Stream<String> anotherStream = Stream.concat(a, item.getStringList());


    anotherStream.forEach(System.out::println);
}

private static class Item {

    public Stream<String> getStringList() {
        List<String> l = new ArrayList<>();

        l.add("C");
        l.add("D");
        l.add("E");
        l.add("F");
        final AtomicInteger i = new AtomicInteger(0);
        return Stream.iterate(l.get(i.get()), (f) -> {
            // Proof of laziness
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return l.get(i.getAndIncrement());
        })
        // Iterate is by default unbound
        .limit(l.size());
    }
}

我不确定这种方法有多么有用,因为你的列表仍在内存中。