Stream
s etkin tembelliğini korumak istiyorsanız (yani sadece ilk eşleşmeyi bulmak istiyorsanız tüm dosyayı okumazsanız), akışı kendiniz oluşturmanız gerekir. Bu çok zor değil, tek engel, hem bir satır numarası hem de String
hattı taşımak için bir tuple tipi olmamasıdır. Ya, Map.Entry
örneklerini kötüye ya adanmış türü oluşturabilirsiniz: Eğer ilk geçtiği
arayabilir yöntemi kullanarak
public static Stream<NumberedLine> lines(Path p) throws IOException {
BufferedReader b=Files.newBufferedReader(p);
Spliterator<NumberedLine> sp=new Spliterators.AbstractSpliterator<NumberedLine>(
Long.MAX_VALUE, Spliterator.ORDERED|Spliterator.NONNULL) {
int line;
public boolean tryAdvance(Consumer<? super NumberedLine> action) {
String s;
try { s=b.readLine(); }
catch(IOException e){ throw new UncheckedIOException(e); }
if(s==null) return false;
action.accept(new NumberedLine(++line, s));
return true;
}
};
return StreamSupport.stream(sp, false).onClose(()->{
try { b.close(); } catch(IOException e){ throw new UncheckedIOException(e); }});
}
:
static final class NumberedLine {
final int number;
final String line;
NumberedLine(int number, String line) {
this.number = number;
this.line = line;
}
public int getNumber() {
return number;
}
public String getLine() {
return line;
}
@Override
public String toString() {
return number+":\t"+line;
}
}
o zaman düz ileri bir dere uygulayabilirsiniz
OptionalInt lNo=lines(path).filter(nl->nl.getLine().contains(word))
.mapToInt(NumberedLine::getNumber)
.findFirst();
veya
List<Integer> all=lines(path).filter(nl->nl.getLine().contains(word))
.map(NumberedLine::getNumber)
.collect(Collectors.toList());
hepsini toplamak
OptionalInt lNo;
try(Stream<NumberedLine> s=lines(path)) {
lNo=s.filter(nl->nl.getLine().contains(word))
.mapToInt(NumberedLine::getNumber)
.findFirst();
}
resp: Eğer altta yatan kaynakların uygun kapanmasını sağlamak istiyoruz kuyu üretim kodunda
Veya.
List<Integer> all;
try(Stream<NumberedLine> s = lines(path)) {
all = s.filter(nl->nl.getLine().contains(word))
.map(NumberedLine::getNumber)
.collect(Collectors.toList());
}
döndürme türü spliterator uygulanması için bir Liste –
wundidajah