<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://wiki.cifprodolfoucha.es/index.php?action=history&amp;feed=atom&amp;title=Expresi%C3%B3ns_lambda_con_ficheiros_%28Clase_Stream%29</id>
	<title>Expresións lambda con ficheiros (Clase Stream) - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cifprodolfoucha.es/index.php?action=history&amp;feed=atom&amp;title=Expresi%C3%B3ns_lambda_con_ficheiros_%28Clase_Stream%29"/>
	<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=Expresi%C3%B3ns_lambda_con_ficheiros_(Clase_Stream)&amp;action=history"/>
	<updated>2026-10-17T04:30:12Z</updated>
	<subtitle>Historial de revisiones de esta página en el wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>https://wiki.cifprodolfoucha.es/index.php?title=Expresi%C3%B3ns_lambda_con_ficheiros_(Clase_Stream)&amp;diff=17574&amp;oldid=prev</id>
		<title>Joselv: Página creada con «= Lambda con Ficheiros = En cada nova versión de Java amplíase o uso de lambda e expresións de programación funcional: actualizanse así as posibilidades de Java para s…»</title>
		<link rel="alternate" type="text/html" href="https://wiki.cifprodolfoucha.es/index.php?title=Expresi%C3%B3ns_lambda_con_ficheiros_(Clase_Stream)&amp;diff=17574&amp;oldid=prev"/>
		<updated>2022-02-28T15:21:13Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «= Lambda con Ficheiros = En cada nova versión de Java amplíase o uso de lambda e expresións de programación funcional: actualizanse así as posibilidades de Java para s…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Lambda con Ficheiros =&lt;br /&gt;
En cada nova versión de Java amplíase o uso de lambda e expresións de programación funcional: actualizanse así as posibilidades de Java para ser unha linguaxe máis directa e menos “verbosa”: resumindo, menos liñas de programación para acadar o mesmo.&lt;br /&gt;
	&lt;br /&gt;
Coa API java.NIO temos a clase Files, que se pode utilizar con expresións lambda.&lt;br /&gt;
A clase Files xunto coa clase Stream crean un binomio moi últil para operacións con ficheiros.&lt;br /&gt;
&lt;br /&gt;
Ler un ficheiro de maneira secuencial:&lt;br /&gt;
&lt;br /&gt;
Path file = Paths.get(&amp;quot;readFile.txt&amp;quot;);&lt;br /&gt;
        try(Stream&amp;lt;String&amp;gt;lines = Files.lines(file)&lt;br /&gt;
                        .onClose(() -&amp;gt; System.out.println(&amp;quot;Fin de lectura&amp;quot;))) {&lt;br /&gt;
            lines.forEach(System.out::println);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
Unha vez que se obten a ruta do ficheiro utilizamos a método estático lines() de Files. Este método devolvenos un fluxo de traballo (Stream), que ten unha directiva cando se pecha o fluxo (onClose) e un método para percorrer todas as liñas (forEach).&lt;br /&gt;
A clase Stream pódese “alimentar” de moitas formas: se pretendemos unha maior eficiencia un obxecto BufferedReader debe ser o elexido. Files ten un método no que se obten un buffer de lectura (newBufferedReader):&lt;br /&gt;
&lt;br /&gt;
try(BufferedReader br = Files.newBufferedReader(file);&lt;br /&gt;
            Stream&amp;lt;String&amp;gt; lines = br.lines()&lt;br /&gt;
                    .onClose(() -&amp;gt; System.out.println(&amp;quot;Fin de lectura de ficheiro.&amp;quot;));){&lt;br /&gt;
            &lt;br /&gt;
            lines.forEach(System.out::println);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
== Ler con procesamento pararelo ==&lt;br /&gt;
Outra opción que nos ofrece Stream e onde non nos ten que importar o tratamento secuencial do ficheiro é o predicado parallel(). O que fai esta opción é crear fios de execución sobre o contido do Stream (neste caso o ficheiro), mellorando o rendemento:&lt;br /&gt;
&lt;br /&gt;
try(Stream&amp;lt;String&amp;gt;lines = Files.lines(file)&lt;br /&gt;
                        .parallel()&lt;br /&gt;
                        .onClose(() -&amp;gt; System.out.println(&amp;quot;Fin de lectura de ficheiro.&amp;quot;))) {&lt;br /&gt;
            &lt;br /&gt;
            //modificamos esta parte para poder observar os fíos que se xeneran&lt;br /&gt;
             lines.forEach(s -&amp;gt;{&lt;br /&gt;
                    System.out.println(s +&amp;quot; &amp;quot; + Thread.currentThread().getName());});&lt;br /&gt;
&lt;br /&gt;
Exemplo -&amp;gt; LerFicheiroLambda.java&lt;br /&gt;
&lt;br /&gt;
Lectura condicional:&lt;br /&gt;
&lt;br /&gt;
	Stream ten un predicado que é filter(): permitenos filtrar qué liñas nos interesa do ficheiro. Ten múltiples opcións; a continuación amosamos un exemplo sinxelo:&lt;br /&gt;
&lt;br /&gt;
try (Stream&amp;lt;String&amp;gt; lines = Files.lines(Path.of(&amp;quot;probas.txt&amp;quot;))) {&lt;br /&gt;
  &lt;br /&gt;
            long i = lines.filter(line -&amp;gt; line.startsWith(&amp;quot;T&amp;quot;))&lt;br /&gt;
            .count();&lt;br /&gt;
	&lt;br /&gt;
	Filter necesita un predicado lóxico booleano, ou utilizar métodos de Stream coma os seguintes:&lt;br /&gt;
contentEquals(String st)&lt;br /&gt;
endsWith(String sufix)&lt;br /&gt;
startsWith(String prefix)&lt;br /&gt;
matches(String red): expresións regulares.&lt;br /&gt;
…&lt;br /&gt;
Exemplos→ LerFilter.java&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Uso de lambda para operacións de directorios e arquivos de sistema ==&lt;br /&gt;
Para listar os directorios dunha ruta, temos a directiva isDirectory de Files:&lt;br /&gt;
&lt;br /&gt;
try (Stream&amp;lt;Path&amp;gt; paths = Files.list(Path.of(folderPath))) {&lt;br /&gt;
  	 paths.filter(Files::isDirectory)&lt;br /&gt;
    	.forEach(System.out::println);&lt;br /&gt;
}&lt;br /&gt;
	Fíxate que devolve un Stream de path é decir rutas de ficheiros.&lt;br /&gt;
&lt;br /&gt;
Para listar os ficheiros dunha ruta:&lt;br /&gt;
&lt;br /&gt;
try (Stream&amp;lt;Path&amp;gt; paths = Files.list(Path.of(folderPath))) {&lt;br /&gt;
    paths.filter(Files::isRegularFile)&lt;br /&gt;
    .forEach(System.out::println);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Para percorrer todo a árbore de directorios:&lt;br /&gt;
	PENDIENTE &lt;br /&gt;
&lt;br /&gt;
Coma se fora de xeito recursivo Files ten un método estático chamado walk() que devolve un stream con todos os elementos da carpeta, das subcarpetas etc. ata chegar a final da árbore. O stream estará formado por todos os camiños que forma esa árbore:&lt;br /&gt;
&lt;br /&gt;
Stream&amp;lt;Path&amp;gt; miStream = Files.walk(Paths.get(&amp;quot;./src&amp;quot;));&lt;br /&gt;
     miStream.forEach(System.out::println);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Búsqueda de ficheiros ==&lt;br /&gt;
A clase Files ten un método de búsqueda de ficheiros. O uso máis frecuente é con tres argumentos de entrada:&lt;br /&gt;
Path p: obxecto que representa a ruta onde se vai buscar.&lt;br /&gt;
int maxDepth: enteiro que representa que nivel de búsqueda se precisa na árbore de directorios. Se indicamos Integer.Maxvalue sería ata o final da árbore de ficheiros, se indicamos “1” sería o primeiro nivel.&lt;br /&gt;
BiPredicate &amp;lt;Path, BasicFileAttributes&amp;gt; matcher: é unha interfaz funcional que serve para indicar as condicións de búsqueda.&lt;br /&gt;
&lt;br /&gt;
try (Stream&amp;lt;Path&amp;gt; pathStream = Files.find(path, Integer.MAX_VALUE,&lt;br /&gt;
                (p, basicFileAttributes) -&amp;gt;&lt;br /&gt;
                        p.getFileName().toString().equalsIgnoreCase(fileName))&lt;br /&gt;
&lt;br /&gt;
Exemplos → BusquedaFicheiroLambda.java&lt;br /&gt;
&lt;br /&gt;
Actividade pasar información dun ficheiro csv a obxectos: &lt;br /&gt;
Igual es mucho y no lo incluyo. Como actividad de ampliación? Vamos viendo!&lt;br /&gt;
&lt;br /&gt;
= Exercicios para practicar =&lt;br /&gt;
== Exercicio 1 - Búsqueda de ficheiros ==&lt;br /&gt;
Crea un método de búsqueda de ficheiros con Files.find a partires dunha ruta cun determinado tamaño (Files.size) usando expresións lambda. Mellora o teu programa detectando se un ficheiro é un directorio (Files.isDirectory), e devolvendo falso.&lt;br /&gt;
Solucion: BusquedaFicheirosTamano.java&lt;br /&gt;
&lt;br /&gt;
== Exercicio 2 - Búsqueda de ficheiros recursiva ==&lt;br /&gt;
Crea un método que busque un ficheiro nun directorio e en todas as suas subcarpetas (ata o final da árbore de directorios) usando lambda. Para ser máis eficiencia usa un filtro con Files::isRegularFile.&lt;br /&gt;
Solución: BusquedaWalkFicheiro.java&lt;/div&gt;</summary>
		<author><name>Joselv</name></author>
		
	</entry>
</feed>