我为前两个简单的项目懒洋洋地创建了一串String。但是,我的部分流是List of String。
webpack-hook.js → "main" JS bundle
↓
./gui/html/index.html → file-loader → dist folder
上面的工作,但.getStringList也需要懒惰地调用。我不清楚如何获取它和"合并"它与流的其余部分一起。
答案 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());
}
}
我不确定这种方法有多么有用,因为你的列表仍在内存中。