Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Mysteriozni Z. 09. 11. 2016, 20:18:43
-
Mám řekněme následující kód:
Files.walk(Paths.get("C:\\"))
.map(Path::toFile)
.filter(File::isFile)
.forEach(file -> System.out.println(file.getAbsolutePath()));
Konkrétně mi jde o tohle: .filter(File::isFile)
Funkce File::isFile vypadá následovně:
public boolean isFile() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
if (isInvalid()) {
return false;
}
return ((fs.getBooleanAttributes(this) & FileSystem.BA_REGULAR) != 0);
}
Pochopil bych, kdyby File::isFile byla staticka tridni metoda
public static boolean isFile(File file) { ... }
Potom by mi bylo jasne, jak .filter(File::isFile) funguje, tj. pres funkcni interface. Jenze funkce isFile() se musi zavolat nad instanci tridy File a ja nechapu, jak se toho da dosahnout pomoci lambd. Muzete mi to nekdo vysvetlit?
Dik
-
Objekt třídy File do toho filtru leze z mapovací (tedy konverzní) metody map toFile.
-
presne tak, tim ze to premapujes na Stream<File>, tak pak u toho filtru muzes pouzit (File f) -> f.isFile() , nebo f -> f.isFile() NEBO File::isFile, protoze se to isFile zavola na tom prvku toho streamu.
-
presne tak, tim ze to premapujes na Stream<File>, tak pak u toho filtru muzes pouzit (File f) -> f.isFile() , nebo f -> f.isFile() NEBO File::isFile, protoze se to isFile zavola na tom prvku toho streamu.
Ano, tomu samozrejme rozumim, ale nechapu jak by to zavolalo isFile jinak, nez za pomoci reflexe. To jde nejak udelat pres lambdy?
-
presne tak, tim ze to premapujes na Stream<File>, tak pak u toho filtru muzes pouzit (File f) -> f.isFile() , nebo f -> f.isFile() NEBO File::isFile, protoze se to isFile zavola na tom prvku toho streamu.
Ano, tomu samozrejme rozumim, ale nechapu jak by to zavolalo isFile jinak, nez za pomoci reflexe. To jde nejak udelat pres lambdy?
Proc by to potrebovalo reflexi? Kdyz mas kolekci souboru, tak map, filter... aplikuji lambdu, ktera ma v hlavicce soubor. Je to omezena podoba typove inference a cele je to resene cmpiletime.
-
presne tak, tim ze to premapujes na Stream<File>, tak pak u toho filtru muzes pouzit (File f) -> f.isFile() , nebo f -> f.isFile() NEBO File::isFile, protoze se to isFile zavola na tom prvku toho streamu.
Ano, tomu samozrejme rozumim, ale nechapu jak by to zavolalo isFile jinak, nez za pomoci reflexe. To jde nejak udelat pres lambdy?
Proc by to potrebovalo reflexi? Kdyz mas kolekci souboru, tak map, filter... aplikuji lambdu, ktera ma v hlavicce soubor. Je to omezena podoba typove inference a cele je to resene cmpiletime.
Mohl by jsi prosim napsat uryvek, jak to priblizne v te motode filter() vypada? Ty vis, ze se ma zavolat metoda File::isFile. Mas taky instanci tridy File, nad kterou se ma isFile zavolat. Jak to teda udelas jinak nez pomoci reflexe:
method.invoke(obj, arg1, arg2,...);
-
presne tak, tim ze to premapujes na Stream<File>, tak pak u toho filtru muzes pouzit (File f) -> f.isFile() , nebo f -> f.isFile() NEBO File::isFile, protoze se to isFile zavola na tom prvku toho streamu.
Ano, tomu samozrejme rozumim, ale nechapu jak by to zavolalo isFile jinak, nez za pomoci reflexe. To jde nejak udelat pres lambdy?
Proc by to potrebovalo reflexi? Kdyz mas kolekci souboru, tak map, filter... aplikuji lambdu, ktera ma v hlavicce soubor. Je to omezena podoba typove inference a cele je to resene cmpiletime.
Mohl by jsi prosim napsat uryvek, jak to priblizne v te motode filter() vypada? Ty vis, ze se ma zavolat metoda File::isFile. Mas taky instanci tridy File, nad kterou se ma isFile zavolat. Jak to teda udelas jinak nez pomoci reflexe:
method.invoke(obj, arg1, arg2,...);
Java je OSS.
-
Tohle nedá ani většina Java lopat, takže začátečník nemá skoro šanci bez velkého studia :D
-
Tak bys mohl vedEt, ze si v te meTode filtr nic neprectu, protoze je to vsechno udelane pres interface.
-
Tohle nedá ani většina Java lopat, takže začátečník nemá skoro šanci bez velkého studia :D
Ale houby, není to žádná věda. Bereš prachy, tak se taky nauč něco nového užitečného. Nebo ti na všechno dává zaměstnavatel lidi a sám nemusíš umět nic, jenom žvanit a chvástat se?
-
Tak bys mohl vedEt, ze si v te meTode filtr nic neprectu, protoze je to vsechno udelane pres interface.
To je takovy problem se dobrat implementace? (on by ti mel stacit i ten interface, aby sis vsimnul tech generik).
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/util/stream/ReferencePipeline.java#l160 by ti mohlo pomoci. Ale zrovna tady ta konkretni implementace spis zamlzi, je tam dost detailu, od kterych te interface odstini.
-
To mi porad nepomohlo. Ano vsiml jsem si generik. Ale generIka ti nijak nepomuzou aby jsi zavolal obecne metodu x nad instanci tridy y.
-
Ok takze ptam se dal. Mam:
@Override
public final Stream<P_OUT> filter(Predicate<? super P_OUT> predicate) {
Objects.requireNonNull(predicate);
return new StatelessOp<P_OUT, P_OUT>(this, StreamShape.REFERENCE,
StreamOpFlag.NOT_SIZED) {
@Override
Sink<P_OUT> opWrapSink(int flags, Sink<P_OUT> sink) {
return new Sink.ChainedReference<P_OUT, P_OUT>(sink) {
@Override
public void begin(long size) {
downstream.begin(-1);
}
@Override
public void accept(P_OUT u) {
if (predicate.test(u))
downstream.accept(u);
}
};
}
};
}
Porad tam nevidim odpoved na co se ptam, jsem u:
predicate.test(u);
-
Rozumim teto variante:
Files.walk(Paths.get("C:\\"))
.map(Path::toFile)
.filter(file -> file.isFile())
.forEach(file -> System.out.println(file.getAbsolutePath()));
Protoze jsem to JA, kdo tam napise, co se ma konkretne zavolat nad file. Ale ne teto variante, paklize tam vnitrne neni pouzita reflexe nebo File::isFile neni tridni metoda:
Files.walk(Paths.get("C:\\"))
.map(Path::toFile)
.filter(File::isFile())
.forEach(file -> System.out.println(file.getAbsolutePath()));
-
Kdo to vysvetli je borec.
-
Už tam skoro jsi:
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
-
Ok, tak já to ukončím. Borec jsem tady já. File::isFile, resp. X::method, kompilátor nahradí lambdou: x -> x.method
Gratuluji. Bylo to tak těžké říct? Asi jo, protože to tu ani Satai Nekola neví.
-
Volas metodu isFile z tridy File, jelikoz je to metoda nestaticka, aplikuje se na objekt daneho streamu. Jelikoz je objekt typu File, tak to projde, jinak by kompilator zahlasil chybu.
Ber to tak, ze kompilator si to interne prepise na f -> f.isFile() (je to predikat, muze se zapsat nekolika zpusoby
// nez jsem to dopsal, pan Mysteriozni si odpovedel... nebylo, rikali ti to vsichni od zacatku
-
Volas metodu isFile z tridy File, jelikoz je to metoda nestaticka, aplikuje se na objekt daneho streamu. Jelikoz je objekt typu File, tak to projde, jinak by kompilator zahlasil chybu.
Ber to tak, ze kompilator si to interne prepise na f -> f.isFile() (je to predikat, muze se zapsat nekolika zpusoby
// nez jsem to dopsal, pan Mysteriozni si odpovedel... nebylo, rikali ti to vsichni od zacatku
Ukaž mi jediný příspěvek, ve kterém někdo napsal:
File::isFile ti kompilátor přepíše na file -> file.isFile()
a jsi možná jsi taky borec jako já.
-
Jednoduchá odpověď, necelých 10 slov. Tak buďto to tady nikdo nevěděl a nebo podle DK mi to všichni říkali, což z nich ovšem dělá solidní autisty že to neumí sdělit jasně a stručně. Zase porod na půl hodiny se tu na root něco dozvědět.
-
Ok, tak já to ukončím. Borec jsem tady já. File::isFile, resp. X::method, kompilátor nahradí lambdou: x -> x.method
Gratuluji. Bylo to tak těžké říct? Asi jo, protože to tu ani Satai Nekola neví.
Compiler nic neprepise, tyhle vyrazy jsou ta sama lambda.
-
Popsal to dustin hned ve druhem prispevku, nebo pecrom ve tretim.
presne tak, tim ze to premapujes na Stream<File>, tak pak u toho filtru muzes pouzit (File f) -> f.isFile() , nebo f -> f.isFile() NEBO File::isFile, protoze se to isFile zavola na tom prvku toho streamu.
-
Jednoduchá odpověď, necelých 10 slov. Tak buďto to tady nikdo nevěděl a nebo podle DK mi to všichni říkali, což z nich ovšem dělá solidní autisty že to neumí sdělit jasně a stručně. Zase porod na půl hodiny se tu na root něco dozvědět.
Kdybys nebyl liny a precetl si libovolny tutorial, vedel bys to sam a nemusel by ses doprosovat na rootu. Zes to nepochopil neznamena, ze ostatni to neumi vysvetlit, ale ze mas dlouhe vedeni.
-
Pro ty kteří v tom pořád nemají jasno a nepřečetli si https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html (https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html):
Pokud se použije syntaxe SomeClass::nonStaticMethod, tak výsledná lambda má vždy o jeden parametr navíc - jako první je instance té třídy (tedy efektivně this). To znamená že File::isFile má ve výsledku jeden parametr, typu File.
-
Pro ty kteří v tom pořád nemají jasno a nepřečetli si https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html (https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html):
Pokud se použije syntaxe SomeClass::nonStaticMethod, tak výsledná lambda má vždy o jeden parametr navíc - jako první je instance té třídy (tedy efektivně this). To znamená že File::isFile má ve výsledku jeden parametr, typu File.
Nebo obecněji: vždy pokud se volá nestatická metoda tak ta metoda má o jeden parametr navíc (this).